# paths./api/ai-account/connected-services/orgs/{org}/users/{user_id}/.get.description
Wires RBAC into a DRF view.

Two responsibilities:

1. When RBAC is enabled, replace the view's `permission_classes` with
   `RbacAuthGate` (the gate the RBAC layer assumes — `IsEdxAuthenticated`
   semantics, plus opt-in acceptance of token-policies PlatformApiKeys for
   views that set `token_policies_enabled = True`).

2. Detect server-to-server (Django auth) callers via `is_service_account`.
   Server-to-server tokens authenticate as Django auth users with no
   relationship to a platform EdxUser. The convention is "we trust this
   caller — bypass RBAC and serve the request."

   Combine it with the RBAC-disabled check at the top of `initial()` so
   the early exit skips all RBAC prep work:

       if not ConfigFlags.rbac_enabled() or self.is_service_account:
           return

   Use `is_service_account` at any other touch points where caller
   identity matters (queryset ownership filters, owner attribution on
   create, serializer context, etc.).

# paths./api/ai-account/connected-services/orgs/{org}/users/{user_id}/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/ai-account/connected-services/orgs/{org}/users/{user_id}/{i.get.description
Wires RBAC into a DRF view.

Two responsibilities:

1. When RBAC is enabled, replace the view's `permission_classes` with
   `RbacAuthGate` (the gate the RBAC layer assumes — `IsEdxAuthenticated`
   semantics, plus opt-in acceptance of token-policies PlatformApiKeys for
   views that set `token_policies_enabled = True`).

2. Detect server-to-server (Django auth) callers via `is_service_account`.
   Server-to-server tokens authenticate as Django auth users with no
   relationship to a platform EdxUser. The convention is "we trust this
   caller — bypass RBAC and serve the request."

   Combine it with the RBAC-disabled check at the top of `initial()` so
   the early exit skips all RBAC prep work:

       if not ConfigFlags.rbac_enabled() or self.is_service_account:
           return

   Use `is_service_account` at any other touch points where caller
   identity matters (queryset ownership filters, owner attribution on
   create, serializer context, etc.).

# paths./api/ai-account/connected-services/orgs/{org}/users/{user_id}/{i.get.parameters[].description
A unique integer value identifying this connected service.

# paths./api/ai-account/connected-services/orgs/{org}/users/{user_id}/{i.delete.description
Wires RBAC into a DRF view.

Two responsibilities:

1. When RBAC is enabled, replace the view's `permission_classes` with
   `RbacAuthGate` (the gate the RBAC layer assumes — `IsEdxAuthenticated`
   semantics, plus opt-in acceptance of token-policies PlatformApiKeys for
   views that set `token_policies_enabled = True`).

2. Detect server-to-server (Django auth) callers via `is_service_account`.
   Server-to-server tokens authenticate as Django auth users with no
   relationship to a platform EdxUser. The convention is "we trust this
   caller — bypass RBAC and serve the request."

   Combine it with the RBAC-disabled check at the top of `initial()` so
   the early exit skips all RBAC prep work:

       if not ConfigFlags.rbac_enabled() or self.is_service_account:
           return

   Use `is_service_account` at any other touch points where caller
   identity matters (queryset ownership filters, owner attribution on
   create, serializer context, etc.).

# paths./api/ai-account/connected-services/orgs/{org}/users/{user_id}/{i.delete.parameters[].description
A unique integer value identifying this connected service.

# paths./api/ai-account/connected-services/orgs/{org}/users/{user_id}/{p.get.description
Wires RBAC into a DRF view.

Two responsibilities:

1. When RBAC is enabled, replace the view's `permission_classes` with
   `RbacAuthGate` (the gate the RBAC layer assumes — `IsEdxAuthenticated`
   semantics, plus opt-in acceptance of token-policies PlatformApiKeys for
   views that set `token_policies_enabled = True`).

2. Detect server-to-server (Django auth) callers via `is_service_account`.
   Server-to-server tokens authenticate as Django auth users with no
   relationship to a platform EdxUser. The convention is "we trust this
   caller — bypass RBAC and serve the request."

   Combine it with the RBAC-disabled check at the top of `initial()` so
   the early exit skips all RBAC prep work:

       if not ConfigFlags.rbac_enabled() or self.is_service_account:
           return

   Use `is_service_account` at any other touch points where caller
   identity matters (queryset ownership filters, owner attribution on
   create, serializer context, etc.).

# paths./api/ai-account/connected-services/orgs/{org}/users/{user_id}/{p.get.responses.200.description
Starts the OAuth flow for the given provider and service

# paths./api/ai-account/orgs/{org}/credential/.get.description
Retrieve LLM credentials for an organization.

Query Parameters:
    name (optional): Filter results by LLM provider name.
        When name=google, returns both 'google' (service account) and
        'gemini_google_api_key' credentials if they exist.
    unmask_sensitive_fields (optional, bool, default False):
        If true, returns the raw unmasked credential value. Restricted
        to credentials owned by the requested tenant — the
        ``GlobalCredential`` fallback is suppressed when unmasking,
        and the response is ``[]`` instead of 404 if the tenant has
        no own credentials.

Args:
    request: The HTTP request
    org: Organization key identifier

Returns:
    Response: List of LLM credentials for the organization. Values
    are masked by default; unmasked when ``unmask_sensitive_fields=true``
    and the credential belongs to the tenant.

Raises:
    NotFound: When organization is not found, or (in default masked
        mode) when no credentials match the filters even after the
        global-credential fallback.
    ValidationError: When query parameters are invalid

# paths./api/ai-account/orgs/{org}/credential/.get.parameters[].description
Filter credentials by provider name (e.g., 'openai', 'google')

# paths./api/ai-account/orgs/{org}/credential/.get.parameters[].description
If true and the requester is a platform admin for the org, returns full unmasked credential values. Restricted to credentials owned by the requested tenant (no main-platform fallback when unmasking). Ignored for non-admins.

# paths./api/ai-account/orgs/{org}/credential/.get.responses.200.content.application/json.examples.LLMCredentialsExample.value[].value.private_key
-----BEGIN PRIVATE KEY-----
XXXX
-----END PRIVATE KEY-----

# paths./api/ai-account/orgs/{org}/credential/.post.description
Create a new LLM credential for an organization.

For azure_openai credentials, if credential already exists, merges the new
models with existing ones instead of replacing.

Args:
    request: The HTTP request containing credential information
    org: Organization key identifier

Returns:
    Response: Created or updated LLM credential

Raises:
    NotFound: When organization is not found
    ValidationError: When request data is invalid

# paths./api/ai-account/orgs/{org}/credential/.patch.description
Update an existing LLM credential for an organization.

For azure_openai credentials, supports partial model updates by deep merging
the provided model fields with existing ones.

Args:
    request: The HTTP request containing updated credential information
    org: Organization key identifier

Returns:
    Response: Updated LLM credential

Raises:
    NotFound: When organization or credential is not found
    ValidationError: When request data is invalid

# paths./api/ai-account/orgs/{org}/credential/.delete.description
Delete an existing LLM credential for an organization.

For azure_openai credentials, supports deleting a specific model by providing
the 'model_name' field. If model_name is omitted, deletes the entire credential.

Args:
    request: The HTTP request containing credential information (must include 'name')
    org: Organization key identifier

Returns:
    Response: 204

Raises:
    NotFound: When organization or credential is not found
    ValidationError: When request data is invalid

# paths./api/ai-account/orgs/{org}/credential/schema/.get.description
Retrieve LLM credentials schemas.

Query Parameters:
    name (optional): Filter results by LLM service name

Args:
    request: The HTTP request
    org: Organization key identifier

Returns:
    Response: List of integration credentials schema available.

Raises:
    NotFound: When  no credentials match the filters
    ValidationError: When query parameters are invalid

# paths./api/ai-account/orgs/{org}/credential/schema/.get.parameters[].description
Filter credentials by provider name (e.g., 'openai', 'google')

# paths./api/ai-account/orgs/{org}/credential/schema/.get.parameters[].description
If true and the requester is a platform admin for the org, returns full unmasked credential values. Restricted to credentials owned by the requested tenant (no main-platform fallback when unmasking). Ignored for non-admins.

# paths./api/ai-account/orgs/{org}/fallback-llm/.get.description
List all fallback LLM configurations for the tenant and global configs.

# paths./api/ai-account/orgs/{org}/fallback-llm/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/ai-account/orgs/{org}/fallback-llm/.post.description
        Create a new fallback LLM configuration.

        - For model scope: specify source_model_name
        - For provider scope: only source_provider_name is needed
        - Leave tenant_key empty for global configuration
        

# paths./api/ai-account/orgs/{org}/fallback-llm/{id}/.get.description
Retrieve a specific fallback LLM configuration.

# paths./api/ai-account/orgs/{org}/fallback-llm/{id}/.put.description
Update an existing fallback LLM configuration.

# paths./api/ai-account/orgs/{org}/fallback-llm/{id}/.patch.description
Partially update an existing fallback LLM configuration.

# paths./api/ai-account/orgs/{org}/fallback-llm/{id}/.patch.summary
Partially update fallback LLM configuration

# paths./api/ai-account/orgs/{org}/integration-credential/.get.description
Retrieve integration credentials for an organization.

Query Parameters:
    name (optional): Filter results by integration service name
    unmask_sensitive_fields (optional, bool, default False):
        If true and the requester is a platform admin for ``org``,
        returns full unmasked credential values. Restricted to
        credentials owned by the requested tenant — the ``main``
        platform fallback is suppressed when unmasking, so admins
        cannot read another tenant's or the global ``main``
        credentials unmasked. Silently ignored for non-admins;
        students never receive sensitive fields regardless of this
        flag.

Args:
    request: The HTTP request
    org: Organization key identifier

Returns:
    Response: List of integration credentials for the organization.
    The response shape differs by caller role:
    - Admins: every credential on the platform, with sensitive
      fields masked (``AdminIntegrationCredentialSerializer`` →
      ``IntegrationCredential.masked_value``).
    - Students: only credentials whose schema declares at least
      one non-sensitive field; sensitive fields are removed
      entirely from each value
      (``StudentIntegrationCredentialSerializer`` →
      ``IntegrationCredential.value``). Visibility is determined
      by ``IntegrationCredential.is_student_visible()`` — schema-
      driven, not a hardcoded provider list.
    If the tenant has no credentials of its own and
    ``ALLOW_TENANTS_TO_USE_MAIN_LLM_CREDENTIALS`` is enabled, the
    view falls back to ``platform__key="main"`` credentials,
    subject to the same role-based filtering.

Raises:
    NotFound: When organization is not found or when no credentials match the filters
    ValidationError: When query parameters are invalid

# paths./api/ai-account/orgs/{org}/integration-credential/.get.parameters[].description
Filter credentials by provider name (e.g., 'openai', 'google')

# paths./api/ai-account/orgs/{org}/integration-credential/.get.parameters[].description
If true and the requester is a platform admin for the org, returns full unmasked credential values. Restricted to credentials owned by the requested tenant (no main-platform fallback when unmasking). Ignored for non-admins.

# paths./api/ai-account/orgs/{org}/integration-credential/.get.responses.200.content.application/json.examples.AdminResponse—SensitiveFieldsMasked.summary
Admin response — sensitive fields masked

# paths./api/ai-account/orgs/{org}/integration-credential/.get.responses.200.content.application/json.examples.AdminResponse—SensitiveFieldsMasked.description
Returned to platform admins. Every credential on the platform is included; sensitive fields (as flagged on the linked IntegrationCredentialSchema v2 entry) are masked via IntegrationCredential.masked_value.

# paths./api/ai-account/orgs/{org}/integration-credential/.get.responses.200.content.application/json.examples.StudentResponse—SensitiveFieldsStripped.summary
Student response — sensitive fields stripped

# paths./api/ai-account/orgs/{org}/integration-credential/.get.responses.200.content.application/json.examples.StudentResponse—SensitiveFieldsStripped.description
Returned to non-admin (student) callers. Only credentials whose schema marks at least one field as non-sensitive are listed; sensitive fields are removed entirely from each value (via IntegrationCredential.value). Credentials with no non-sensitive fields, or whose schema is missing/v1, are omitted from the list.

# paths./api/ai-account/orgs/{org}/integration-credential/.post.description
Create a new integration credential for an organization.

Args:
    request: The HTTP request containing credential information
    org: Organization key identifier

Returns:
    Response: Created integration credential

Raises:
    NotFound: When organization is not found
    ValidationError: When request data is invalid

# paths./api/ai-account/orgs/{org}/integration-credential/.post.requestBody.content.application/json.examples.CreateIntegrationCredential—Response.summary
Create integration credential — response

# paths./api/ai-account/orgs/{org}/integration-credential/.post.requestBody.content.application/json.examples.CreateIntegrationCredential—Response.description
Admin-only. The POST response is serialized through IntegrationCredentialSerializer.to_representation, which substitutes IntegrationCredential.masked_value for the raw value, so sensitive fields are always returned masked even though the request body sends them unmasked.

# paths./api/ai-account/orgs/{org}/integration-credential/.post.responses.200.content.application/json.examples.CreateIntegrationCredential—Response.summary
Create integration credential — response

# paths./api/ai-account/orgs/{org}/integration-credential/.post.responses.200.content.application/json.examples.CreateIntegrationCredential—Response.description
Admin-only. The POST response is serialized through IntegrationCredentialSerializer.to_representation, which substitutes IntegrationCredential.masked_value for the raw value, so sensitive fields are always returned masked even though the request body sends them unmasked.

# paths./api/ai-account/orgs/{org}/integration-credential/.patch.description
Update an existing integration credential for an organization.

Args:
    request: The HTTP request containing updated credential information
    org: Organization key identifier

Returns:
    Response: Updated integration credential

Raises:
    NotFound: When organization or credential is not found
    ValidationError: When request data is invalid

# paths./api/ai-account/orgs/{org}/integration-credential/.delete.description
Delete an existing integration credential for an organization.

Args:
    request: The HTTP request containing credential information (must include 'name')
    org: Organization key identifier

Returns:
    Response: 204

Raises:
    NotFound: When organization or credential is not found
    ValidationError: When request data is invalid

# paths./api/ai-account/orgs/{org}/integration-credential/schema/.get.description
Retrieve integration credentials schema (deprecated v1 shape).

Query Parameters:
    name (optional): Filter results by integration service name

Args:
    request: The HTTP request
    org: Organization key identifier

Returns:
    Response: List of integration credentials schema in v1 shape with
    ``Deprecation`` and ``Link`` headers pointing to the v2 endpoint.

# paths./api/ai-account/orgs/{org}/integration-credential/schema/.get.parameters[].description
Filter credentials by provider name (e.g., 'openai', 'google')

# paths./api/ai-account/orgs/{org}/integration-credential/schema/.get.parameters[].description
If true and the requester is a platform admin for the org, returns full unmasked credential values. Restricted to credentials owned by the requested tenant (no main-platform fallback when unmasking). Ignored for non-admins.

# paths./api/ai-account/orgs/{org}/integration-credential/schema/v2/.get.description
Retrieve V2 integration credentials schema with sensitivity metadata.

Query Parameters:
    name (optional): Filter results by integration service name

Args:
    request: The HTTP request
    org: Organization key identifier

Returns:
    Response: List of integration credentials schema with is_sensitive metadata.

# paths./api/ai-account/orgs/{org}/integration-credential/schema/v2/.get.parameters[].description
Filter credentials by provider name (e.g., 'openai', 'google')

# paths./api/ai-account/orgs/{org}/integration-credential/schema/v2/.get.parameters[].description
If true and the requester is a platform admin for the org, returns full unmasked credential values. Restricted to credentials owned by the requested tenant (no main-platform fallback when unmasking). Ignored for non-admins.

# paths./api/ai-account/orgs/{org}/integration-credential/schema/v2/.get.responses.200.content.application/json.examples.IntegrationCredentialsSchemaV2Example.summary
Integration credentials schema v2 example

# paths./api/ai-account/orgs/{org}/llm-credential/.get.description
Retrieve LLM credentials for an organization.

Query Parameters:
    name (optional): Filter results by LLM provider name.
        When name=google, returns both 'google' (service account) and
        'gemini_google_api_key' credentials if they exist.
    unmask_sensitive_fields (optional, bool, default False):
        If true, returns the raw unmasked credential value. Restricted
        to credentials owned by the requested tenant — the
        ``GlobalCredential`` fallback is suppressed when unmasking,
        and the response is ``[]`` instead of 404 if the tenant has
        no own credentials.

Args:
    request: The HTTP request
    org: Organization key identifier

Returns:
    Response: List of LLM credentials for the organization. Values
    are masked by default; unmasked when ``unmask_sensitive_fields=true``
    and the credential belongs to the tenant.

Raises:
    NotFound: When organization is not found, or (in default masked
        mode) when no credentials match the filters even after the
        global-credential fallback.
    ValidationError: When query parameters are invalid

# paths./api/ai-account/orgs/{org}/llm-credential/.get.parameters[].description
Filter credentials by provider name (e.g., 'openai', 'google')

# paths./api/ai-account/orgs/{org}/llm-credential/.get.parameters[].description
If true and the requester is a platform admin for the org, returns full unmasked credential values. Restricted to credentials owned by the requested tenant (no main-platform fallback when unmasking). Ignored for non-admins.

# paths./api/ai-account/orgs/{org}/llm-credential/.get.responses.200.content.application/json.examples.LLMCredentialsExample.value[].value.private_key
-----BEGIN PRIVATE KEY-----
XXXX
-----END PRIVATE KEY-----

# paths./api/ai-account/orgs/{org}/llm-credential/.post.description
Create a new LLM credential for an organization.

For azure_openai credentials, if credential already exists, merges the new
models with existing ones instead of replacing.

Args:
    request: The HTTP request containing credential information
    org: Organization key identifier

Returns:
    Response: Created or updated LLM credential

Raises:
    NotFound: When organization is not found
    ValidationError: When request data is invalid

# paths./api/ai-account/orgs/{org}/llm-credential/.patch.description
Update an existing LLM credential for an organization.

For azure_openai credentials, supports partial model updates by deep merging
the provided model fields with existing ones.

Args:
    request: The HTTP request containing updated credential information
    org: Organization key identifier

Returns:
    Response: Updated LLM credential

Raises:
    NotFound: When organization or credential is not found
    ValidationError: When request data is invalid

# paths./api/ai-account/orgs/{org}/llm-credential/.delete.description
Delete an existing LLM credential for an organization.

For azure_openai credentials, supports deleting a specific model by providing
the 'model_name' field. If model_name is omitted, deletes the entire credential.

Args:
    request: The HTTP request containing credential information (must include 'name')
    org: Organization key identifier

Returns:
    Response: 204

Raises:
    NotFound: When organization or credential is not found
    ValidationError: When request data is invalid

# paths./api/ai-account/orgs/{org}/masked-integration-credential/.get.description
Retrieve masked integration credentials for an organization.

Query Parameters:
    name (optional): Filter results by integration service name

Args:
    request: The HTTP request
    org: Organization key identifier

Returns:
    Response: List of integration credentials for the organization

Raises:
    NotFound: When organization is not found or when no credentials match the filters
    ValidationError: When query parameters are invalid

# paths./api/ai-account/orgs/{org}/masked-integration-credential/.get.parameters[].description
Filter credentials by provider name (e.g., 'openai', 'google')

# paths./api/ai-account/orgs/{org}/masked-integration-credential/.get.parameters[].description
If true and the requester is a platform admin for the org, returns full unmasked credential values. Restricted to credentials owned by the requested tenant (no main-platform fallback when unmasking). Ignored for non-admins.

# paths./api/ai-account/orgs/{org}/masked-llm-credential/.get.description
Retrieve LLM credentials for an organization with the value entries masked.

Query Parameters:
    name (optional): Filter results by LLM provider name

Args:
    request: The HTTP request
    org: Organization key identifier

Returns:
    Response: List of LLM credentials for the organization

Raises:
    NotFound: When organization is not found or when no credentials match the filters
    ValidationError: When query parameters are invalid

# paths./api/ai-account/orgs/{org}/masked-llm-credential/.get.parameters[].description
Filter credentials by provider name (e.g., 'openai', 'google')

# paths./api/ai-account/orgs/{org}/masked-llm-credential/.get.parameters[].description
If true and the requester is a platform admin for the org, returns full unmasked credential values. Restricted to credentials owned by the requested tenant (no main-platform fallback when unmasking). Ignored for non-admins.

# paths./api/ai-account/orgs/{org}/oauth-services/.get.description
Return the list of OAuth services that can be used for connected services.

Query Parameters:
    name (optional): Filter by exact service name (case-insensitive).
    include_disabled (optional): Set to `true` to include disabled services.

# paths./api/ai-account/orgs/{org}/oauth-services/{service_name}/scopes/.get.description
Return the available scopes for the specified OAuth service.

Query Parameters:
    include_disabled (optional): Set to `true` to include scopes from disabled services.

# paths./api/ai-account/orgs/{org}/use-default-llm-key/.post.description
Enable or disable the use of main LLM credentials for an organization.

Request Body:
    enable (boolean): Set to true to enable main credentials
    disable (boolean): Set to true to disable main credentials

Args:
    request: The HTTP request
    org: Organization key identifier

Returns:
    Response: Confirmation message

Raises:
    ValidationError: When neither enable nor disable is specified

# paths./api/ai-account/orgs/{org}/use-default-llm-key/.post.responses.200.content.application/json.examples.EnableMainCredentialsResponse.value.message
Tenant is now using the main credentials

# paths./api/ai-account/orgs/{org}/use-default-llm-key/.post.responses.200.content.application/json.examples.DisableMainCredentialsResponse.value.message
Tenant is not using the main credentials

# paths./api/ai-account/orgs/{org}/use-free-trial/.post.description
Enable, disable, or update free trial settings for an organization.

Request Body:
    enable (boolean): Set to true to enable free trial
    disable (boolean): Set to true to disable free trial
    metadata (object, optional): Additional metadata for the free trial

Args:
    request: The HTTP request
    org: Organization key identifier

Returns:
    Response: Confirmation message

# paths./api/ai-account/orgs/{org}/users/{user_id}/chat-privacy-config/.get.description
Return whether the tenant allows user-controlled chat privacy.

# paths./api/ai-account/orgs/{org}/users/{user_id}/chat-privacy-config/.patch.description
Flip `ALLOW_USER_CHAT_PRIVACY_CONTROL` for the tenant. Admins only.

# paths./api/ai-account/orgs/{org}/users/{user_id}/chat-privacy-effectiv.get.description
Get the effective chat-privacy mode for the given (tenant, mentor,
user, session) tuple.

Args:
    request: HTTP request. Query params: `mentor` (unique_id, slug, or
        name — unique_id tried first), `session` (uuid).
    org: Platform key.
    user_id: Username of the user whose effective mode is being resolved.

# paths./api/ai-account/orgs/{org}/users/{user_id}/chat-privacy-effectiv.get.responses.200.description
Effective chat privacy mode and source tier

# paths./api/ai-account/orgs/{org}/users/{user_id}/chat-privacy-settings.get.description
Get user's global chat privacy settings.

Returns the user's current chat privacy mode if the feature is enabled
for the platform, otherwise indicates the feature is disabled.

# paths./api/ai-account/orgs/{org}/users/{user_id}/chat-privacy-settings.post.description
Update user's global chat privacy settings.

Allows users to set their chat privacy preference (normal, anonymized, or disabled)
if the platform has enabled the ALLOW_USER_CHAT_PRIVACY_CONTROL setting.

# paths./api/ai-account/orgs/{org}/users/{user_id}/default-llm-key-usage.get.description
Retrieve the status of main LLM credential usage for an organization.

Args:
    request: The HTTP request
    org: Organization key identifier
    user_id: User identifier

Returns:
    Response: Status of main LLM credential usage

# paths./api/ai-account/orgs/{org}/users/{user_id}/free-trial.get.description
Retrieve the free trial status for an organization.

Args:
    request: The HTTP request
    org: Organization key identifier

Returns:
    Response: Free trial status (boolean)

Raises:
    NotFound: When organization is not found

# paths./api/ai-account/orgs/{org}/users/{user_id}/tenant-settings/.post.description
Example Request:

```
{"teams_bot_mentor": "f2116cf2-95c7-4c1f-b19e-666ad529439f"}
```
The value here is the mentor's unique id

# paths./api/ai-analytics/audience/orgs/{org}/active-users/over-time.get.description
Get active user counts over time.

This endpoint provides daily counts of active users (users with known activity)
over a specified time period.

Query Parameters:
    start_date (str, optional): Start date for the time range (ISO format)
    end_date (str, optional): End date for the time range (ISO format)

Returns:
    Daily active user counts over the specified time period, with change metrics
    compared to previous periods.

Default time range is the last 7 days if no dates are specified.

An active user is defined as a user with any activity within the past 30 days.

# paths./api/ai-analytics/audience/orgs/{org}/active-users/over-time.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/audience/orgs/{org}/active-users/per-course.get.description
Get active user counts on a per-course basis.

This endpoint provides counts of active users for each course within
the specified date range.

Query Parameters:
    start_date (str, optional): Start date for filtering (ISO format)
    end_date (str, optional): End date for filtering (ISO format)

Returns:
    A list of courses with their active user counts.

Default time range is the last 7 days if no dates are specified.

# paths./api/ai-analytics/audience/orgs/{org}/active-users/per-course.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/audience/orgs/{org}/active-users/users.get.description
Get a list of active users with activity metrics.

This endpoint provides a paginated list of users who have had activity
within the specified date range.

Query Parameters:
    start_date (str, optional): Start date for filtering (ISO format)
    end_date (str, optional): End date for filtering (ISO format)
    course_id (str, optional): Filter by course ID
    page (int, optional): Page number for pagination
    length (int, optional): Number of items per page

Returns:
    A paginated list of active users with their activity metrics.

Default time range is the last 7 days if no dates are specified.

# paths./api/ai-analytics/audience/orgs/{org}/active-users/users.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/audience/orgs/{org}/enrollments/courses/{cours.get.description
Get enrollment or unenrollment counts over time.

This endpoint provides daily counts of new enrollments or unenrollments
over a specified time period.

Query Parameters:
    start_date (str, optional): Start date for the time range (ISO format)
    end_date (str, optional): End date for the time range (ISO format)
    course_id (str, optional): Filter by course ID
    active (bool): Get enrollments when true, unenrollments when false

Returns:
    Daily counts over the specified time period, with change metrics
    compared to previous periods.

Default time range is the last 7 days if no dates are specified.

# paths./api/ai-analytics/audience/orgs/{org}/enrollments/courses/{cours.get.parameters[].description
Any of `y`, `yes`, `true`. set to false or no for unenrollments 

* `y` - y
* `yes` - yes
* `true` - true
* `True` - True
* `n` - n
* `no` - no
* `false` - false
* `False` - False

# paths./api/ai-analytics/audience/orgs/{org}/enrollments/courses/{cours.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/audience/orgs/{org}/enrollments/courses/{cours.get.description
List users enrolled in a specific course.

This endpoint provides a list of users who are enrolled or unenrolled
in a specified course.

Query Parameters:
    course_id (str): The course ID to get enrollments for
    active (bool): Filter for active enrollments when true, inactive when false
    page (int, optional): Page number for pagination
    length (int, optional): Number of items per page

Returns:
    A paginated list of users with:
    - Username
    - Full name
    - Email
    - Enrollment timestamp

# paths./api/ai-analytics/audience/orgs/{org}/enrollments/courses/{cours.get.parameters[].description
Any of `y`, `yes`, `true`. set to false or no for unenrollments 

* `y` - y
* `yes` - yes
* `true` - true
* `True` - True
* `n` - n
* `no` - no
* `false` - false
* `False` - False

# paths./api/ai-analytics/audience/orgs/{org}/enrollments/courses/{cours.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/audience/orgs/{org}/enrollments/over-time.get.description
Get enrollment or unenrollment counts over time.

This endpoint provides daily counts of new enrollments or unenrollments
over a specified time period.

Query Parameters:
    start_date (str, optional): Start date for the time range (ISO format)
    end_date (str, optional): End date for the time range (ISO format)
    course_id (str, optional): Filter by course ID
    active (bool): Get enrollments when true, unenrollments when false

Returns:
    Daily counts over the specified time period, with change metrics
    compared to previous periods.

Default time range is the last 7 days if no dates are specified.

# paths./api/ai-analytics/audience/orgs/{org}/enrollments/over-time.get.parameters[].description
Any of `y`, `yes`, `true`. set to false or no for unenrollments 

* `y` - y
* `yes` - yes
* `true` - true
* `True` - True
* `n` - n
* `no` - no
* `false` - false
* `False` - False

# paths./api/ai-analytics/audience/orgs/{org}/enrollments/over-time.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/audience/orgs/{org}/enrollments/per-course.get.description
List enrollment statistics on a per-course basis.

This endpoint provides enrollment counts for all courses, with options
to filter for active or inactive enrollments and to include time-based data.

Query Parameters:
    active (bool): Filter for active enrollments when true, inactive when false
    start_date (str, optional): Start date for time-based filtering (ISO format)
    end_date (str, optional): End date for time-based filtering (ISO format)
    page (int, optional): Page number for pagination
    length (int, optional): Number of items per page

Returns:
    A paginated list of courses with their enrollment counts and percentages.

# paths./api/ai-analytics/audience/orgs/{org}/enrollments/per-course.get.parameters[].description
Any of `y`, `yes`, `true`. set to false or no for unenrollments 

* `y` - y
* `yes` - yes
* `true` - true
* `True` - True
* `n` - n
* `no` - no
* `false` - false
* `False` - False

# paths./api/ai-analytics/audience/orgs/{org}/enrollments/per-course.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/audience/orgs/{org}/registered-users/.get.description
List all learners on the platform with aggregated metrics.

This endpoint returns a paginated list of all learners with key metrics including:
- Enrollment counts
- Completion counts
- Time spent on platform

Query Parameters:
    page (int): Page number for pagination
    length (int): Number of items per page
    search (str): Filter learners by username, email, or name

Returns:
    A paginated list of learners with their associated metrics.

# paths./api/ai-analytics/audience/orgs/{org}/registered-users/.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/audience/orgs/{org}/registered-users/over-time.get.description
Get registered user counts over time.

This endpoint provides daily counts of new user registrations over a
specified time period.

Query Parameters:
    start_date (str, optional): Start date for the time range (ISO format)
    end_date (str, optional): End date for the time range (ISO format)

Returns:
    Daily registration counts over the specified time period, with change metrics
    compared to previous periods.

Default time range is the last 7 days if no dates are specified.

# paths./api/ai-analytics/audience/orgs/{org}/registered-users/over-time.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/audience/orgs/{org}/registered-users/per-cours.get.description
List enrollment statistics on a per-course basis.

This endpoint provides enrollment counts for all courses, with options
to filter for active or inactive enrollments and to include time-based data.

Query Parameters:
    active (bool): Filter for active enrollments when true, inactive when false
    start_date (str, optional): Start date for time-based filtering (ISO format)
    end_date (str, optional): End date for time-based filtering (ISO format)
    page (int, optional): Page number for pagination
    length (int, optional): Number of items per page

Returns:
    A paginated list of courses with their enrollment counts and percentages.

# paths./api/ai-analytics/audience/orgs/{org}/registered-users/per-cours.get.parameters[].description
Any of `y`, `yes`, `true`. set to false or no for unenrollments 

* `y` - y
* `yes` - yes
* `true` - true
* `True` - True
* `n` - n
* `no` - no
* `false` - false
* `False` - False

# paths./api/ai-analytics/audience/orgs/{org}/registered-users/per-cours.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/costs/pertenant/.get.description
Retrieve paginated LLM usage costs aggregated by tenant.

# paths./api/ai-analytics/departments/orgs/{org}/.get.description
Get a list of departments with metrics and filtering options.

This endpoint provides a paginated list of departments with aggregated metrics
about learner performance, course completions, and skill acquisition.

Query Parameters:
    page (int, optional): Page number for pagination
    length (int, optional): Number of items per page
    program (str, optional): Filter by program
    pathway (str, optional): Filter by pathway
    departments (list, optional): Filter by department ids
    department_id (str, optional): Filter by department id
    location (str, optional): Filter by location
    is_enrolled (bool, optional): Filter for departments with enrolled users
    start_date (date, optional): Filter by learner join date (start range)
    end_date (date, optional): Filter by learner join date (end range)

Returns:
    A paginated list of departments with comprehensive metrics.

# paths./api/ai-analytics/departments/orgs/{org}/.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/departments/orgs/{org}/.get.parameters[].description
Departments search string. Single string or list of strings. e.g 'sample_department' or `['department', 'another department']` 

# paths./api/ai-analytics/departments/orgs/{org}/.get.parameters[].description
Filter by learners date_joined. Start date. ISO 8601

# paths./api/ai-analytics/departments/orgs/{org}/.get.parameters[].description
Filter for users who have at least an enro;lment

# paths./api/ai-analytics/departments/orgs/{org}/.get.parameters[].description
Filter by learners date_joined. Start date. ISO 8601

# paths./api/ai-analytics/engagement/orgs/{org}/activity.get.description
Get engagement metrics on a per-course basis.

This endpoint provides a paginated list of courses with engagement metrics
including activity counts, time spent, and interaction data.

Query Parameters:
    page (int, optional): Page number for pagination
    length (int, optional): Number of items per page

Returns:
    A paginated list of courses with their engagement metrics.

# paths./api/ai-analytics/engagement/orgs/{org}/activity.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/engagement/orgs/{org}/course_completion/over-t.get.description
Completion count per user per course across the platform

Query Params
1. start_date e.g 2020-10-01
2. end_date e.g 2020-10-10

Default result when no query param is added is last_7_days (today inclusive)

# paths./api/ai-analytics/engagement/orgs/{org}/course_completion/over-t.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/engagement/orgs/{org}/course_completion/per-co.get.description
List course completion metrics on a per-course basis.

This endpoint provides a paginated table of courses with enrollment and
completion statistics for each course.

Returns:
    A paginated list of courses with:
    - Course identification (ID and name)
    - Enrollment count
    - Completion count
    - Average completion rate

# paths./api/ai-analytics/engagement/orgs/{org}/course_completion/per-co.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/engagement/orgs/{org}/courses/{course_id}/time.get.description
Average time spent in secs on a per-day basis

Query Params
1. start_date e.g 2020-10-01
2. end_date e.g 2020-10-10
3. course_id <optional>

Default result when no query param is added is last_7_days (today inclusive)

# paths./api/ai-analytics/engagement/orgs/{org}/courses/{course_id}/time.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/engagement/orgs/{org}/courses/{course_id}/time.get.description
Time spent per course in secs in a tree like form

Kwargs
course_id e.g course-v1:Org+Course4+Run

Query Params
1. start_date <optional> e.g 2020-10-01
2. end_date <optional> e.g 2020-10-10

# paths./api/ai-analytics/engagement/orgs/{org}/courses/{course_id}/time.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/engagement/orgs/{org}/courses/{course_id}/time.get.description
Time spent per course in secs on a per-day basis

Query Params
1. start_date e.g 2020-10-01
2. end_date e.g 2020-10-10
Kwargs
3. course_id

Default result when no query param is added is last_7_days (today inclusive)

# paths./api/ai-analytics/engagement/orgs/{org}/courses/{course_id}/time.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/engagement/orgs/{org}/courses/{course_id}/time.get.description
Time spent by users in a course

Query Params
course_id  e.g course-v1:Org+Course4+Run

# paths./api/ai-analytics/engagement/orgs/{org}/courses/{course_id}/time.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/engagement/orgs/{org}/courses/{course_id}/time.get.description
Time spent within a course in ordered hierarchical format

Kwargs
1. course_id  e.g course-v1:Org+Course4+Run
2. user_id e.g developer@ibleducation.com or dev123 (username|email)
Query Params
3. start_date <optional> e.g 2020-10-01
4. end_date <optional> e.g 2020-10-10

# paths./api/ai-analytics/engagement/orgs/{org}/courses/{course_id}/time.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/engagement/orgs/{org}/courses/{course_id}/time.get.description
Time spent in secs on a per-day basis

Query Params
1. course_id <optional> e.g course-v1:Org+Course4+Run
2. user_id <optional> e.g developer@ibleducation.com or dev123 (username|email)
3. start_date e.g 2020-10-01
4. end_date e.g 2020-10-10

Default result when no query param is added is last_7_days (today inclusive)

# paths./api/ai-analytics/engagement/orgs/{org}/courses/{course_id}/time.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/engagement/orgs/{org}/courses/{course_id}/vide.get.description
Get video engagement metrics for a specific course.

This endpoint provides detailed video engagement statistics for a single course,
including view counts, completion rates, and time spent on videos.

Query Parameters:
    course_id (str): The course ID to get video engagement data for

Returns:
    Detailed video engagement metrics for the specified course.

# paths./api/ai-analytics/engagement/orgs/{org}/courses/{course_id}/vide.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/engagement/orgs/{org}/courses/{course_id}/vide.get.description
Get video watch counts over time.

This endpoint provides daily counts of videos watched over a specified time period,
with options to filter by course or user.

Query Parameters:
    start_date (str, optional): Start date for the time range (ISO format)
    end_date (str, optional): End date for the time range (ISO format)
    course_id (str, optional): Filter by course ID
    user_id (str, optional): Filter by username or email

Returns:
    Daily video watch counts over the specified time period.

Default time range is the last 7 days if no dates are specified.

Access Control:
    - Platform admins can access any video watch data
    - Learners can access their own video watch data

# paths./api/ai-analytics/engagement/orgs/{org}/courses/{course_id}/vide.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/engagement/orgs/{org}/courses/{course_id}/vide.get.description
Get a summary of video watch statistics for a specific course.

This endpoint provides a structured summary of video watch data for a course,
organized in a tree-like format by course sections and subsections.

Query Parameters:
    course_id (str): The course ID to get video summary for

Returns:
    A hierarchical structure of video watch data for the course, including:
    - Section and subsection organization
    - Video identification and metadata
    - Watch counts and completion rates

# paths./api/ai-analytics/engagement/orgs/{org}/courses/{course_id}/vide.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/engagement/orgs/{org}/courses/{course_id}/vide.get.description
List of users' videos completed records for a specific course

Kwargs
course_id  e.g course-v1:Org+Course4+Run

# paths./api/ai-analytics/engagement/orgs/{org}/courses/{course_id}/vide.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/engagement/orgs/{org}/time/average-perlearner-.get.description
Average time spent by a learner in enrolled courses. Gives a rough estimate of whats the average time
that would be spent by a learner in a course

Query Params
1. start_date e.g 2020-10-01
2. end_date e.g 2020-10-10

# paths./api/ai-analytics/engagement/orgs/{org}/time/average-perlearner-.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/engagement/orgs/{org}/time/average-with-over-t.get.description
Average time spent in secs on a per-day basis

Query Params
1. start_date e.g 2020-10-01
2. end_date e.g 2020-10-10
3. course_id <optional>

Default result when no query param is added is last_7_days (today inclusive)

# paths./api/ai-analytics/engagement/orgs/{org}/time/average-with-over-t.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/engagement/orgs/{org}/time/over-time.get.description
Get time spent on the platform over time.

This endpoint provides daily time spent values (in seconds) across the
platform over a specified time period.

Query Parameters:
    start_date (str, optional): Start date for the time range (ISO format)
    end_date (str, optional): End date for the time range (ISO format)

Returns:
    Daily time spent values over the specified time period, with change metrics
    compared to previous periods.

Default time range is the last 7 days if no dates are specified.

# paths./api/ai-analytics/engagement/orgs/{org}/time/over-time.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/engagement/orgs/{org}/time/per-course.get.description
Get time spent statistics on a per-course basis.

This endpoint provides a paginated list of courses with the total time
spent by users in each course.

Query Parameters:
    start_date (str, optional): Start date for filtering (ISO format)
    end_date (str, optional): End date for filtering (ISO format)
    page (int, optional): Page number for pagination
    length (int, optional): Number of items per page

Returns:
    A paginated list of courses with:
    - Course identification (ID and name)
    - Total time spent (in seconds)
    - Formatted time spent (human-readable)
    - Percentage of total platform time

# paths./api/ai-analytics/engagement/orgs/{org}/time/per-course.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/engagement/orgs/{org}/videos/.get.description
Get video engagement metrics on a per-course basis.

This endpoint provides a paginated list of courses with video engagement metrics
including view counts, completion rates, and time spent on videos.

Query Parameters:
    page (int, optional): Page number for pagination
    length (int, optional): Number of items per page

Returns:
    A paginated list of courses with their video engagement metrics.

# paths./api/ai-analytics/engagement/orgs/{org}/videos/.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/engagement/orgs/{org}/videos/over-time.get.description
Get video watch counts over time.

This endpoint provides daily counts of videos watched over a specified time period,
with options to filter by course or user.

Query Parameters:
    start_date (str, optional): Start date for the time range (ISO format)
    end_date (str, optional): End date for the time range (ISO format)
    course_id (str, optional): Filter by course ID
    user_id (str, optional): Filter by username or email

Returns:
    Daily video watch counts over the specified time period.

Default time range is the last 7 days if no dates are specified.

Access Control:
    - Platform admins can access any video watch data
    - Learners can access their own video watch data

# paths./api/ai-analytics/engagement/orgs/{org}/videos/over-time.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/average-messages-pe.get.description
Retrieve average message counts per session over time.

This endpoint returns data on the average number of messages exchanged in each
conversation session within a specified date range, with options for filtering
by mentor and aggregating by different time periods (hourly, daily, weekly).

Args:
    request: The HTTP request containing filter query parameters.
    org: Organization key identifier.

Returns:
    Response: Time series of average message counts and session totals.

Raises:
    NotFound: If the specified organization does not exist.
    BadRequest: If the provided parameters are invalid.

Query Parameters:
    start_date (str): Start date for filtering (YYYY-MM-DD) - required.
    end_date (str): End date for filtering (YYYY-MM-DD) - required.
    mentor_id (str): Filter by mentor unique ID.
    aggregation (str): Time aggregation level (hourly, daily, weekly) - default: daily.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/average-messages-pe.get.parameters[].description
Time aggregation level (hourly, daily, weekly)

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/chat-history/.get.description
API viewset for retrieving and filtering chat message history.

This viewset provides endpoints for retrieving chat message history
within an organization, with extensive filtering options by date range,
user, topic, mentor, and sentiment.

Permissions:
    - Restricted to platform administrators only

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/chat-history/.get.parameters[].description
A page number within the paginated result set.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/chat-history/.post.description
API viewset for retrieving and filtering chat message history.

This viewset provides endpoints for retrieving chat message history
within an organization, with extensive filtering options by date range,
user, topic, mentor, and sentiment.

Permissions:
    - Restricted to platform administrators only

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/chat-history-filter.get.description
Retrieve filter options for chat message history.

This endpoint returns data on available filter options for the chat message
history endpoint, including topics, date ranges (weekly or monthly),
sentiments, and users who have chat history.

Args:
    request: The HTTP request containing query parameters.
    org: Organization key identifier.

Returns:
    Response: Available filter options for chat message history.

Raises:
    NotFound: If the specified organization does not exist.

Query Parameters:
    monthly_range (bool): Whether to return monthly or weekly date ranges.
    mentor_id (str): Filter users by those who have chatted with a specific mentor.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/chat-history-filter.get.responses.200.content.application/json.examples.ChatMessageHistoryFilterOptionsResponse.summary
Chat Message History Filter Options Response

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/chat-history/{id}/.get.description
API viewset for retrieving and filtering chat message history.

This viewset provides endpoints for retrieving chat message history
within an organization, with extensive filtering options by date range,
user, topic, mentor, and sentiment.

Permissions:
    - Restricted to platform administrators only

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/chat-history/{id}/.put.description
API viewset for retrieving and filtering chat message history.

This viewset provides endpoints for retrieving chat message history
within an organization, with extensive filtering options by date range,
user, topic, mentor, and sentiment.

Permissions:
    - Restricted to platform administrators only

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/chat-history/{id}/.patch.description
API viewset for retrieving and filtering chat message history.

This viewset provides endpoints for retrieving chat message history
within an organization, with extensive filtering options by date range,
user, topic, mentor, and sentiment.

Permissions:
    - Restricted to platform administrators only

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/chat-history/{id}/.delete.description
API viewset for retrieving and filtering chat message history.

This viewset provides endpoints for retrieving chat message history
within an organization, with extensive filtering options by date range,
user, topic, mentor, and sentiment.

Permissions:
    - Restricted to platform administrators only

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/conversation/.get.description
Retrieve conversation volume data over time.

This endpoint returns data on the number of conversations that occurred
within a specified date range, with options for different time aggregations
(hourly, daily, weekly). Results can be filtered by mentor.

Args:
    request: The HTTP request containing filter query parameters.
    org: Organization key identifier.
    user_id: User identifier (not used in the implementation).

Returns:
    Response: Time series data of conversation counts.

Raises:
    NotFound: If the specified organization does not exist.
    BadRequest: If the provided parameters are invalid.

Query Parameters:
    start_date (str): Start date for filtering (YYYY-MM-DD) - required.
    end_date (str): End date for filtering (YYYY-MM-DD) - required.
    mentor_id (str): Filter by mentor unique ID.
    aggregation (str): Time aggregation level (hourly, daily, weekly) - default: daily.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/conversation/.get.parameters[].description
Time aggregation level (hourly, daily, weekly)

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/conversation-summar.get.description
Retrieve a summary of conversation metrics.

This endpoint returns aggregated metrics about conversations within an organization,
including:
- Total number of conversations
- Total number of human messages
- Total number of AI messages

Results can be filtered by mentor.

Args:
    request: The HTTP request containing filter query parameters.
    org: Organization key identifier.

Returns:
    Response: Summary of conversation metrics.

Raises:
    NotFound: If the specified organization does not exist.

Query Parameters:
    mentor_id (str): Filter by mentor unique ID.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/costs/model/.get.description
Retrieve the  model costs for a tenant

Filter parameters for period are start_date and enddate

Accessible to tenant Admins only.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/costs/permentor/.get.description
Retrieve LLM usage costs aggregated by mentor.

This endpoint returns data on the total cost of LLM usage for each mentor
within a specified date range, with pagination support. The costs are
calculated by summing the costs of all observations associated with
traces from the mentor's sessions.

Args:
    request: The HTTP request containing filter query parameters.
    org: Organization key identifier.

Returns:
    Response: Paginated list of mentors with their total LLM usage costs.

Raises:
    NotFound: If the specified organization does not exist.
    BadRequest: If the provided parameters are invalid.

Query Parameters:
    start_date (str): Start date for filtering (YYYY-MM-DD) - required.
    end_date (str): End date for filtering (YYYY-MM-DD) - required.
    limit (int): Number of results per page - default: 5.
    offset (int): Offset for pagination - default: 0.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/costs/peruser/.get.description
Retrieve LLM usage costs aggregated by user.

This endpoint returns data on the total cost of LLM usage for each user
within a specified date range, with pagination support. The costs are
calculated by summing the costs of all observations associated with
traces from the user's sessions.

Args:
    request: The HTTP request containing filter query parameters.
    org: Organization key identifier.

Returns:
    Response: Paginated list of users with their total LLM usage costs.

Raises:
    NotFound: If the specified organization does not exist.
    BadRequest: If the provided parameters are invalid.

Query Parameters:
    start_date (str): Start date for filtering (YYYY-MM-DD) - required.
    end_date (str): End date for filtering (YYYY-MM-DD) - required.
    limit (int): Number of results per page - default: 10.
    offset (int): Offset for pagination - default: 0.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/mentor-detail/.get.description
Retrieve summary statistics about mentors.

This endpoint returns aggregated statistics about mentors within an organization,
including total mentors, active mentors (mentors with at least one session),
questions answered, and ratings.

Args:
    request: The HTTP request.
    org: Organization key identifier.

Returns:
    Response: Summary statistics about mentors.

Raises:
    NotFound: If the specified organization does not exist.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/mentor-summary/.get.description
Retrieve summary statistics about mentors.

This endpoint returns aggregated statistics about mentors within an organization,
including total mentors, active mentors (mentors with at least one session),
questions answered, and ratings.

Args:
    request: The HTTP request.
    org: Organization key identifier.

Returns:
    Response: Summary statistics about mentors.

Raises:
    NotFound: If the specified organization does not exist.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/mentors/{mentor_uni.get.description
Retrieve LLM usage costs for a specific mentor.

This endpoint returns data on the total cost of LLM usage for a specific mentor
within a specified date range. The cost is calculated by summing the costs
of all observations associated with traces from the tenant's sessions.

Args:
    request: The HTTP request containing filter query parameters.
    org: Organization key identifier.
    mentor_unique_id: User key identifier.

Returns:
    Response: Total LLM usage cost for the specified tenant.

Raises:
    NotFound: If the specified organization does not exist.
    BadRequest: If the provided parameters are invalid.

Query Parameters:
    start_date (str): Start date for filtering (YYYY-MM-DD) - required.
    end_date (str): End date for filtering (YYYY-MM-DD) - required.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/most-discussed-topi.get.description
Retrieve the most discussed topics over time.

This endpoint returns data on the frequency of topics discussed in conversations
within a specified date range, with options for filtering by mentor and
aggregating by different time periods (hourly, daily, weekly).

Args:
    request: The HTTP request containing filter query parameters.
    org: Organization key identifier.

Returns:
    Response: List of topics with their conversation counts, ordered by frequency.

Raises:
    NotFound: If the specified organization does not exist.
    BadRequest: If the provided parameters are invalid.

Query Parameters:
    start_date (str): Start date for filtering (YYYY-MM-DD) - required.
    end_date (str): End date for filtering (YYYY-MM-DD) - required.
    mentor_id (str): Filter by mentor unique ID.
    aggregation (str): Time aggregation level (hourly, daily, weekly) - default: daily.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/most-discussed-topi.get.parameters[].description
Time aggregation level (hourly, daily, weekly)

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/my-chat-history/.get.description
API viewset for retrieving a user's own chat message history.

Permissions:
    - Any authenticated user can access their own data
    - Users cannot access other users' data

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/my-chat-history/.get.parameters[].description
A page number within the paginated result set.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/my-chat-history-fil.get.description
Retrieve filter options for the user's own chat message history.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/my-chat-history-rep.get.description
List all chat history reports created by the user.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/my-chat-history-rep.post.description
Create a report for the user's own chat history. Only my-chat-history report is allowed.

Supported filters in request body:
- `mentor_id` or `mentor`: Filter by specific mentor ID (single value or list)
- `topic`: Filter by conversation topic
- `sentiment`: Filter by sentiment (positive, negative, neutral)
- `start_date` and `end_date`: Date range filters (YYYY-MM-DD format)

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/my-chat-history-rep.get.description
Get the status of a user's own chat history report.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/my-chat-history-rep.get.description
Download a completed user chat history report as CSV or JSON.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/my-chat-history-rep.get.parameters[].description
Comma-separated column names to control output order.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/my-chat-history/{id.get.description
API viewset for retrieving a user's own chat message history.

Permissions:
    - Any authenticated user can access their own data
    - Users cannot access other users' data

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/observations/.get.description
Viewset for retrieving and listing Langfuse observations.

This viewset provides read-only access to Langfuse observations data for platform admins.
Observations represent detailed tracking of AI model interactions and responses.

Permissions:
    - Restricted to platform administrators only

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/observations/.get.parameters[].description
The initial index from which to return the results.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/observations/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/observations/{id}/.get.description
Viewset for retrieving and listing Langfuse observations.

This viewset provides read-only access to Langfuse observations data for platform admins.
Observations represent detailed tracking of AI model interactions and responses.

Permissions:
    - Restricted to platform administrators only

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/overview-summary/.get.description
Retrieve an overview of key analytics metrics.

This endpoint returns a comprehensive overview of key analytics metrics
for an organization, including:
- Conversation volume: Total sessions and month-over-month change
- Users: Total unique users and month-over-month change
- Topics: Total unique topics and month-over-month change
- User ratings: Total ratings and month-over-month change

Results can be filtered by mentor.

Args:
    request: The HTTP request containing filter query parameters.
    org: Organization key identifier.
    user_id: User identifier (not used in the implementation).

Returns:
    Response: Overview of key analytics metrics with month-over-month changes.

Raises:
    NotFound: If the specified organization does not exist.

Query Parameters:
    mentor_id (str): Filter analytics by mentor unique ID.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/rating-summary/.get.description
Retrieve user rating metrics over time.

This endpoint returns data on the number of user ratings submitted
within a specified date range, aggregated by day or hour.

Args:
    request: The HTTP request containing filter query parameters.
    org: Organization key identifier.

Returns:
    Response: Time series of rating counts aggregated by day or hour.

Raises:
    NotFound: If the specified organization does not exist.
    BadRequest: If the provided parameters are invalid.

Query Parameters:
    start_date (str): Start date for filtering (YYYY-MM-DD) - required.
    end_date (str): End date for filtering (YYYY-MM-DD) - required.
    group_by (str): Aggregation level (day or hour) - default: day.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/registered-users-tr.get.description
Retrieve trends of registered users over time.

This endpoint returns data on the number of new user registrations
within a specified date range, with options for different time aggregations
(hourly, daily, weekly, monthly). The data is backfilled to ensure
continuous time series even for periods with zero registrations.

Args:
    request: The HTTP request containing filter query parameters.
    org: Organization key identifier.

Returns:
    Response: Time series of user registration counts.

Raises:
    NotFound: If the specified organization does not exist.
    BadRequest: If the provided parameters are invalid.

Query Parameters:
    start_date (str): Start date for filtering (YYYY-MM-DD) - required.
    end_date (str): End date for filtering (YYYY-MM-DD) - required.
    aggregation (str): Time aggregation level (hourly, daily, weekly, monthly) - default: daily.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/registered-users-tr.get.parameters[].description
Time aggregation level (hourly, daily, weekly, monthly)

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/sentiment-count/.get.description
Retrieve user sentiment counts over time.

This endpoint returns data on the number of user sentiment entries
within a specified time period, aggregated by date.

Args:
    request: The HTTP request containing filter query parameters.
    org: Organization key identifier.
    user_id: User identifier.

Returns:
    Response: Time series data of sentiment counts.

Raises:
    NotFound: If the specified organization does not exist.
    ValidationError: If the provided query parameters are invalid.

Query Parameters:
    period (str): Time period filter (today, yesterday, 7d, 30d, 90d) - default: 7d.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/tenant-cost/.get.description
Retrieve LLM usage costs for a specific tenant.

This endpoint returns data on the total cost of LLM usage for a specific tenant
within a specified date range. The cost is calculated by summing the costs
of all observations associated with traces from the tenant's sessions.

Args:
    request: The HTTP request containing filter query parameters.
    org: Organization key identifier.

Returns:
    Response: Total LLM usage cost for the specified tenant.

Raises:
    NotFound: If the specified organization does not exist.
    BadRequest: If the provided parameters are invalid.

Query Parameters:
    start_date (str): Start date for filtering (YYYY-MM-DD) - required.
    end_date (str): End date for filtering (YYYY-MM-DD) - required.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/top-students-by-cha.get.description
Retrieve the most engaged students based on chat message count.

This endpoint returns data on the top 20 students with the highest number of
chat messages, with optional filtering by mentor and date range.

Args:
    request: The HTTP request containing filter query parameters.
    org: Organization key identifier.
    user_id: User identifier (not used in the implementation).

Returns:
    Response: List of top students with their chat message counts.

Raises:
    NotFound: If the specified organization does not exist.
    BadRequest: If the provided parameters are invalid.

Query Parameters:
    mentor_id (str): Filter by mentor unique ID.
    start_date (str): Start date for filtering (YYYY-MM-DD).
    end_date (str): End date for filtering (YYYY-MM-DD).

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/topic-overview/.get.description
Retrieve aggregated topic statistics.

This endpoint returns statistical information about topics within an organization,
including total topics, new topics, and percentage changes compared to the
previous month. Results can be filtered by mentor.

Args:
    request: The HTTP request containing filter query parameters.
    org: Organization key identifier.

Returns:
    Response: Statistical information about topics.

Raises:
    NotFound: If the specified organization or mentor does not exist.

Query Parameters:
    mentor_id (str): Filter statistics by mentor unique ID.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/topic-statistics/.get.description
Retrieve paginated statistics about topics.

This endpoint returns detailed statistics about topics, including:
- Number of conversations related to each topic
- Total message count for each topic
- Average sentiment of conversations about each topic
- Average user rating for conversations about each topic

Results can be filtered by mentor and date range, and are paginated.

Args:
    request: The HTTP request containing filter query parameters.
    org: Organization key identifier.

Returns:
    Response: Paginated list of topic statistics.

Raises:
    NotFound: If the specified organization or mentor does not exist.
    BadRequest: If the provided parameters are invalid.

Query Parameters:
    start_date (str): Start date for filtering (YYYY-MM-DD).
    end_date (str): End date for filtering (YYYY-MM-DD).
    mentor_id (str): Filter by mentor unique ID.
    page (int): Page number for pagination - default: 1.
    page_size (int): Number of results per page - default: 20.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/topics/summary/.get.description
Retrieve a summary of the most frequent topics.

This endpoint returns a summary of the top 10 topics discussed in chat sessions,
ordered by conversation count. Results can be filtered by mentor and date range.

Args:
    request: The HTTP request containing filter query parameters.
    org: Organization key identifier.

Returns:
    Response: A list of the top 10 topics with their conversation counts.

Raises:
    NotFound: If the specified organization does not exist.
    BadRequest: If the provided date format is invalid.

Query Parameters:
    mentor_id (str): Filter by mentor unique ID.
    start_date (str): Start date for filtering (YYYY-MM-DD).
    end_date (str): End date for filtering (YYYY-MM-DD).

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/total-users-by-ment.get.description
Retrieve the total number of users interacting with mentors over time.

This endpoint returns data on the number of unique users who interacted with
mentors each day or hour within a specified date range, with optional
filtering by specific mentor. If no date range is provided, the last 30 days
are used by default.

Args:
    request: The HTTP request containing filter query parameters.
    org: Organization key identifier.

Returns:
    Response: Time series of unique user counts.

Raises:
    NotFound: If the specified organization or mentor does not exist.
    BadRequest: If the provided parameters are invalid.

Query Parameters:
    start_date (str): Start date for filtering (YYYY-MM-DD) - defaults to 30 days ago.
    end_date (str): End date for filtering (YYYY-MM-DD) - defaults to today.
    aggregation (str): Time aggregation level (hourly, daily) - default: daily.
    mentor_id (str): Filter by mentor unique ID.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/traces/.get.description
Viewset for retrieving and listing Langfuse traces.

This viewset provides read-only access to Langfuse traces data for platform admins.
Traces represent high-level tracking of user interactions and AI responses.

Permissions:
    - Restricted to platform administrators only

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/traces/.get.parameters[].description
The initial index from which to return the results.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/traces/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/traces/{id}/.get.description
Viewset for retrieving and listing Langfuse traces.

This viewset provides read-only access to Langfuse traces data for platform admins.
Traces represent high-level tracking of user interactions and AI responses.

Permissions:
    - Restricted to platform administrators only

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/transcripts/.get.description
Retrieve message data from conversations.

This endpoint returns data on messages within conversations, with options
for filtering by date range, topics, and mentor.

Args:
    request: The HTTP request containing filter query parameters.
    org: Organization key identifier.
    user_id: User identifier (not used in the implementation).

Returns:
    Response: A list of conversation message data.

Raises:
    NotFound: If the specified organization does not exist.
    ValidationError: If the provided query parameters are invalid.

Query Parameters:
    start_date (str): Start date for filtering (YYYY-MM-DD).
    end_date (str): End date for filtering (YYYY-MM-DD).
    topics (str): Comma-separated list of topics to filter by.
    mentor (str): Filter by mentor unique ID.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/usage-summary/.get.description
Retrieve daily user engagement metrics with mentors.

This endpoint returns data on the number of unique users who interact with
mentors each day within a specified date range.

Args:
    request: The HTTP request containing filter query parameters.
    org: Organization key identifier.

Returns:
    Response: Daily time series of unique user counts.

Raises:
    NotFound: If the specified organization does not exist.
    BadRequest: If the provided parameters are invalid.

Query Parameters:
    start_date (str): Start date for filtering (YYYY-MM-DD) - required.
    end_date (str): End date for filtering (YYYY-MM-DD) - required.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/user-cohorts-over-t.get.description
Retrieve user cohort trends over time.

This endpoint returns data on the distribution of new versus veteran users
over time, with options for different time aggregations and filtering by mentor.
New users are those who registered within the specified date range, while
veteran users are those who registered before the date range but were active
during it.

Args:
    request: The HTTP request containing filter query parameters.
    org: Organization key identifier.

Returns:
    Response: Time series of new and veteran user counts.

Raises:
    NotFound: If the specified organization does not exist.
    BadRequest: If the provided parameters are invalid.

Query Parameters:
    start_date (str): Start date for filtering (YYYY-MM-DD) - required.
    end_date (str): End date for filtering (YYYY-MM-DD) - required.
    aggregation (str): Time aggregation level (hourly, daily, weekly) - default: daily.
    mentor_id (str): Filter by mentor unique ID.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/user-cohorts-over-t.get.parameters[].description
Time aggregation level (hourly, daily, weekly)

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/user-cost/.get.description
Retrieve LLM usage costs for a specific user.

This endpoint returns data on the total cost of LLM usage for a specific user
within a specified date range. The cost is calculated by summing the costs
of all observations associated with traces from the tenant's sessions.

Args:
    request: The HTTP request containing filter query parameters.
    org: Organization key identifier.
    user_id: User key identifier.

Returns:
    Response: Total LLM usage cost for the specified tenant.

Raises:
    NotFound: If the specified organization does not exist.
    BadRequest: If the provided parameters are invalid.

Query Parameters:
    start_date (str): Start date for filtering (YYYY-MM-DD) - required.
    end_date (str): End date for filtering (YYYY-MM-DD) - required.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/user-feedback/.get.description
Retrieve aggregated user chat feedback counts.

This endpoint returns data on the number of user chat feedback entries
within a specified date range, with options for different time aggregations
(hourly, daily, weekly). Results can be filtered by mentor.

Args:
    request: The HTTP request containing filter query parameters.
    org: Organization key identifier.

Returns:
    Response: Time series data of feedback counts.

Raises:
    NotFound: If the specified organization does not exist.
    BadRequest: If the provided parameters are invalid.

Query Parameters:
    start_date (str): Start date for filtering (YYYY-MM-DD) - required.
    end_date (str): End date for filtering (YYYY-MM-DD) - required.
    mentor_id (str): Filter by mentor unique ID.
    aggregation (str): Time aggregation level (hourly, daily, weekly) - default: daily.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/user-feedback/.get.parameters[].description
Time aggregation level (hourly, daily, weekly)

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/user-feedback/.get.responses.200.content.application/json.examples.UserChatFeedbackCountResponse(Daily).summary
User Chat Feedback Count Response (Daily)

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/user-metrics/.get.description
Retrieve comprehensive user metrics.

This endpoint returns data on various user metrics with month-over-month
change calculations:
- Registered users: Total users registered on the platform
- New users: Users who joined in the current month
- Unique users: Distinct users who have had sessions
- Veteran users: Users who have been active for at least 6 months

Results can be filtered by mentor.

Args:
    request: The HTTP request containing filter query parameters.
    org: Organization key identifier.

Returns:
    Response: Comprehensive user metrics with month-over-month changes.

Raises:
    NotFound: If the specified organization does not exist.

Query Parameters:
    mentor_id (str): Filter metrics by mentor unique ID.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/user-metrics-pie-ch.get.description
Retrieve user distribution data for pie charts.

This endpoint returns data on the distribution of new versus returning users
within a specified date range, including both counts and percentages,
suitable for pie chart visualization.

Args:
    request: The HTTP request containing filter query parameters.
    org: Organization key identifier.

Returns:
    Response: Distribution of new versus returning users with counts and percentages.

Raises:
    NotFound: If the specified organization does not exist.
    BadRequest: If the provided parameters are invalid.

Query Parameters:
    start_date (str): Start date for filtering (YYYY-MM-DD) - required.
    end_date (str): End date for filtering (YYYY-MM-DD) - required.
    mentor_id (str): Filter by mentor unique ID.

# paths./api/ai-analytics/orgs/{org}/users/{user_id}/user-sentiment/.get.description
Retrieve user sentiment distribution.

This endpoint returns data on the distribution of user sentiments (positive,
negative, neutral) within a specified date range, expressed as percentages.

Args:
    request: The HTTP request containing filter query parameters.
    org: Organization key identifier.

Returns:
    Response: Sentiment distribution percentages and total sentiment count.

Raises:
    NotFound: If the specified organization does not exist.
    BadRequest: If the provided parameters are invalid.

Query Parameters:
    start_date (str): Start date for filtering (YYYY-MM-DD) - required.
    end_date (str): End date for filtering (YYYY-MM-DD) - required.

# paths./api/ai-analytics/overview/orgs/{org}/active-users.get.description
Get active user counts over time.

This endpoint provides daily counts of active users (users with known activity)
over a specified time period.

Query Parameters:
    start_date (str, optional): Start date for the time range (ISO format)
    end_date (str, optional): End date for the time range (ISO format)

Returns:
    Daily active user counts over the specified time period, with change metrics
    compared to previous periods.

Default time range is the last 7 days if no dates are specified.

An active user is defined as a user with any activity within the past 30 days.

# paths./api/ai-analytics/overview/orgs/{org}/active-users.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/overview/orgs/{org}/average-grade.get.description
Get average grade value for platform, course, or user.

This endpoint returns the average grade at different levels:
- Platform level: Average grade across all courses
- Course level: Average grade for a specific course
- Learner level: Average grade for a specific learner
- Course-learner level: Grade for a specific learner in a specific course

Query Parameters:
    course_id (str, optional): Filter by course ID
    learner_id (str, optional): Filter by username or email

Returns:
    The average grade value based on the specified filters.

Access Control:
    - Platform admins can access any grade data
    - Learners can access their own grade data

# paths./api/ai-analytics/overview/orgs/{org}/average-grade.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/overview/orgs/{org}/courses/completions.get.description
Get course completion summary metrics over time.

This endpoint provides completion statistics across the platform over a
specified time period, including daily completion counts and overall metrics.

Query Parameters:
    start_date (str): Start date for the time range (ISO format)
    end_date (str): End date for the time range (ISO format)

Returns:
    Completion data including:
    - Daily completion counts over time
    - Total unique user count
    - Total completion count
    - Completion percentage
    - Change metrics compared to previous periods

Default time range is the last 7 days if no dates are specified.

# paths./api/ai-analytics/overview/orgs/{org}/courses/completions.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/overview/orgs/{org}/learners.get.description
List all learners on the platform with aggregated metrics.

This endpoint returns a paginated list of all learners with key metrics including:
- Enrollment counts
- Completion counts
- Time spent on platform

Query Parameters:
    page (int): Page number for pagination
    length (int): Number of items per page
    search (str): Filter learners by username, email, or name

Returns:
    A paginated list of learners with their associated metrics.

# paths./api/ai-analytics/overview/orgs/{org}/learners.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/overview/orgs/{org}/most-active-courses.get.description
Get time spent statistics on a per-course basis.

This endpoint provides a paginated list of courses with the total time
spent by users in each course.

Query Parameters:
    start_date (str, optional): Start date for filtering (ISO format)
    end_date (str, optional): End date for filtering (ISO format)
    page (int, optional): Page number for pagination
    length (int, optional): Number of items per page

Returns:
    A paginated list of courses with:
    - Course identification (ID and name)
    - Total time spent (in seconds)
    - Formatted time spent (human-readable)
    - Percentage of total platform time

# paths./api/ai-analytics/overview/orgs/{org}/most-active-courses.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/overview/orgs/{org}/registered-users.get.description
Get registered user counts over time.

This endpoint provides daily counts of new user registrations over a
specified time period.

Query Parameters:
    start_date (str, optional): Start date for the time range (ISO format)
    end_date (str, optional): End date for the time range (ISO format)

Returns:
    Daily registration counts over the specified time period, with change metrics
    compared to previous periods.

Default time range is the last 7 days if no dates are specified.

# paths./api/ai-analytics/overview/orgs/{org}/registered-users.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/performance/orgs/{org}/courses/{course_id}/gra.get.description
Get average grade value for platform, course, or user.

This endpoint returns the average grade at different levels:
- Platform level: Average grade across all courses
- Course level: Average grade for a specific course
- Learner level: Average grade for a specific learner
- Course-learner level: Grade for a specific learner in a specific course

Query Parameters:
    course_id (str, optional): Filter by course ID
    learner_id (str, optional): Filter by username or email

Returns:
    The average grade value based on the specified filters.

Access Control:
    - Platform admins can access any grade data
    - Learners can access their own grade data

# paths./api/ai-analytics/performance/orgs/{org}/courses/{course_id}/gra.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/performance/orgs/{org}/courses/{course_id}/gra.get.description
Returns average course grade and grade cuttoff

e.g
```
{
    "data": {
        "grade_cutoffs": {
            "A": 90,
            "B": 80,
            "C": 70,
        },
        "average_grade": 50.0,
    }
}
```

Kwargs
course_id

# paths./api/ai-analytics/performance/orgs/{org}/courses/{course_id}/gra.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/performance/orgs/{org}/courses/{course_id}/gra.get.description
Grading summary for the entire course overview in a tree-like format

Kwargs
course_id <required>

# paths./api/ai-analytics/performance/orgs/{org}/courses/{course_id}/gra.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/performance/orgs/{org}/courses/{course_id}/gra.get.description
Grading information per enrolled user in a course

Kwargs
course_id <required>

# paths./api/ai-analytics/performance/orgs/{org}/courses/{course_id}/gra.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/performance/orgs/{org}/courses/{course_id}/gra.get.description
Returns average grades across various assignment types in a course

Query Params
course_id

Returns:
    dict
    {
        "data": [
            {
                "assignment_type': <str>,
                "weight": <float>,
                "average_weighted_grade": <float>,
                "average_section_grade": <float>
            }, ...
        ]
    }

# paths./api/ai-analytics/performance/orgs/{org}/courses/{course_id}/gra.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/performance/orgs/{org}/grading/average.get.description
Get average grade value for platform, course, or user.

This endpoint returns the average grade at different levels:
- Platform level: Average grade across all courses
- Course level: Average grade for a specific course
- Learner level: Average grade for a specific learner
- Course-learner level: Grade for a specific learner in a specific course

Query Parameters:
    course_id (str, optional): Filter by course ID
    learner_id (str, optional): Filter by username or email

Returns:
    The average grade value based on the specified filters.

Access Control:
    - Platform admins can access any grade data
    - Learners can access their own grade data

# paths./api/ai-analytics/performance/orgs/{org}/grading/average.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/performance/orgs/{org}/grading/per-course.get.description
List grade-related performance data for all courses.

This endpoint provides a comprehensive view of grade performance across
courses, including enrollment counts, pass rates, and average grades.

Returns:
    A paginated list of courses with:
    - Course identification (ID and name)
    - Enrollment count
    - Number of students who passed
    - Average grade

# paths./api/ai-analytics/performance/orgs/{org}/grading/per-course.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/perlearner/orgs/{org}/learners.get.description
Enhanced API endpoint for listing learners with comprehensive filtering.

This endpoint provides a paginated list of learners with detailed metrics
and supports advanced filtering options. It uses DM token authentication
and respects department-based access controls.

Query Parameters:
    page (int): Page number for pagination
    length (int): Number of items per page
    search (str): Filter by username, email, or full name
    program (str): Filter by program
    location (str): Filter by location
    is_enrolled (bool): Filter for users with enrollments
    platform (str): Filter by platform
    start_date (date): Filter by join date (start range)
    end_date (date): Filter by join date (end range)

Returns:
    A paginated list of learners with comprehensive metrics including:
    - Course enrollments and completions
    - Time spent on platform
    - Pathway progress
    - Certificate and skill information
    - Location data

Access Control:
    - Platform admins can see all learners
    - Department admins can only see learners in their departments

# paths./api/ai-analytics/perlearner/orgs/{org}/learners.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/perlearner/orgs/{org}/learners.get.parameters[].description
Filter for users who have at least an enrollment

# paths./api/ai-analytics/perlearner/orgs/{org}/learners.get.parameters[].description
Search string for learner. email, username or full name

# paths./api/ai-analytics/perlearner/orgs/{org}/learners.get.parameters[].description
Learner date_joined start date. ISO 8601

# paths./api/ai-analytics/perlearner/orgs/{org}/users.get.description
List all learners on the platform with aggregated metrics.

This endpoint returns a paginated list of all learners with key metrics including:
- Enrollment counts
- Completion counts
- Time spent on platform

Query Parameters:
    page (int): Page number for pagination
    length (int): Number of items per page
    search (str): Filter learners by username, email, or name

Returns:
    A paginated list of learners with their associated metrics.

# paths./api/ai-analytics/perlearner/orgs/{org}/users.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/activity.get.description
Provides information on user enrollments

Params
user_id e.g developer@ibleducation.com| developer

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/activity.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/courses/.get.description
Provides about a learner current grade in a course with the course cut
Kwargs
1. course_id e.g course-v1:Org+Course4+Run
2. user_id e.g developer@ibleducation.com or dev123 (username|email)

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/courses/.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/courses/.get.description
DRF view mixin that routes all ORM reads to the read replica.

Falls back to the primary database if the replica is unreachable.

Add as the **first** base class on read-only views/viewsets::

    class MyView(ReadReplicaViewMixin, IsPlatformAdminDRFMixin, APIView):
        ...

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/courses/.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/courses/.get.description
Query Params
1. course_id e.g course-v1:Org+Course4+Run
2. user_id e.g developer@ibleducation.com or dev123 (username|email)

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/courses/.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/courses/.get.description
Average of days with atleast an activity within ENGAGEMENT_INDEX_PERIOD consecutive days for a learner in a course

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/courses/.get.description
Provides about a learner current grade in a course with the course cut
Kwargs
1. course_id e.g course-v1:Org+Course4+Run
2. user_id e.g developer@ibleducation.com or dev123 (username|email)

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/courses/.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/courses/.get.description
Evaluates performance index for platform, per course, per user and per user-per course

Query Params
course_id <optional>
learner_id <optional>

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/courses/.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/courses/.get.description
Time spent within a course in secs on a per-day basis

Kwargs
1. course_id  e.g course-v1:Org+Course4+Run
2. user_id e.g developer@ibleducation.com or dev123 (username|email)
Query Params
3. start_date e.g 2020-10-01
4. end_date e.g 2020-10-10

Default result when no query param is added is last_7_days (today inclusive)

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/courses/.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/courses/.get.description
List of videos within a course a learner has watched

Kwargs
1. course_id e.g course-v1:Org+Course4+Run
2. user_id e.g developer@ibleducation.com or dev123 (username|email)

Default result when no query param is added is [], 0

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/courses/.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/courses/.get.description
Get video watch counts over time.

This endpoint provides daily counts of videos watched over a specified time period,
with options to filter by course or user.

Query Parameters:
    start_date (str, optional): Start date for the time range (ISO format)
    end_date (str, optional): End date for the time range (ISO format)
    course_id (str, optional): Filter by course ID
    user_id (str, optional): Filter by username or email

Returns:
    Daily video watch counts over the specified time period.

Default time range is the last 7 days if no dates are specified.

Access Control:
    - Platform admins can access any video watch data
    - Learners can access their own video watch data

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/courses/.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/grades/p.get.description
Summary Grading Information for a learner on a per-enrollment basis

Query Params
1. user_id e.g developer@ibleducation.com or dev123 (username|email)

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/grades/p.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/info.get.description
Retrieve detailed information about a specific learner.

This endpoint returns personal and activity information about a learner,
including profile data, activity metrics, and location information.

Path Parameters:
    user_id (str): The username or email of the learner

Query Parameters:
    meta (bool): Include additional analytics information when true

Returns:
    Detailed learner information including:
    - Profile data (username, name, email)
    - Registration and activity dates
    - Activity metrics (assessments, time spent, videos watched)
    - Location and browser information (when available)

Access Control:
    - Platform admins can access any learner
    - Learners can access their own information
    - Department admins can access learners in their departments

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/info.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/info.get.parameters[].description
Include extra analytics information?

* `y` - y
* `yes` - yes
* `true` - true
* `True` - True
* `n` - n
* `no` - no
* `false` - false
* `False` - False

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/last-acc.get.description
Last course accessed by a learner, includes upto unit information as well

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/last-acc.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/overview.get.description
Average of days with atleast an activity within ENGAGEMENT_INDEX_PERIOD consecutive days

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/overview.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/overview.get.description
Get average grade value for platform, course, or user.

This endpoint returns the average grade at different levels:
- Platform level: Average grade across all courses
- Course level: Average grade for a specific course
- Learner level: Average grade for a specific learner
- Course-learner level: Grade for a specific learner in a specific course

Query Parameters:
    course_id (str, optional): Filter by course ID
    learner_id (str, optional): Filter by username or email

Returns:
    The average grade value based on the specified filters.

Access Control:
    - Platform admins can access any grade data
    - Learners can access their own grade data

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/overview.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/overview.get.description
Evaluates performance index for platform, per course, per user and per user-per course

Query Params
course_id <optional>
learner_id <optional>

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/overview.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/overview.get.description
Time spent in secs on a per-day basis

Query Params
1. course_id <optional> e.g course-v1:Org+Course4+Run
2. user_id <optional> e.g developer@ibleducation.com or dev123 (username|email)
3. start_date e.g 2020-10-01
4. end_date e.g 2020-10-10

Default result when no query param is added is last_7_days (today inclusive)

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/overview.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/videos/o.get.description
Get video watch counts over time.

This endpoint provides daily counts of videos watched over a specified time period,
with options to filter by course or user.

Query Parameters:
    start_date (str, optional): Start date for the time range (ISO format)
    end_date (str, optional): End date for the time range (ISO format)
    course_id (str, optional): Filter by course ID
    user_id (str, optional): Filter by username or email

Returns:
    Daily video watch counts over the specified time period.

Default time range is the last 7 days if no dates are specified.

Access Control:
    - Platform admins can access any video watch data
    - Learners can access their own video watch data

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/videos/o.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/videos/p.get.description
Summary Videos watched data for a learner per enrollment

Query Params
1. user_id e.g developer@ibleducation.com or dev123 (username|email)

# paths./api/ai-analytics/perlearner/orgs/{org}/users/{user_id}/videos/p.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/user-groups/orgs/{org}/.get.description
Get a list of user groups with metrics and filtering options.

This endpoint provides a paginated list of user groups with aggregated metrics
about learner performance, course completions, and skill acquisition.

This endpoint uses DM token authentication and respects department-based
access controls.

Query Parameters:
    page (int, optional): Page number for pagination
    length (int, optional): Number of items per page
    program (str, optional): Filter by program
    pathway (str, optional): Filter by pathway
    groups (list, optional): Filter by group names
    location (str, optional): Filter by location
    is_enrolled (bool, optional): Filter for groups with enrolled users
    start_date (date, optional): Filter by learner join date (start range)
    end_date (date, optional): Filter by learner join date (end range)

Returns:
    A paginated list of user groups with comprehensive metrics.

Access Control:
    - Platform admins can see all groups
    - Department admins can only see groups in their departments

# paths./api/ai-analytics/user-groups/orgs/{org}/.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/ai-analytics/user-groups/orgs/{org}/.get.parameters[].description
Filter by learners date_joined. Start date. ISO 8601

# paths./api/ai-analytics/user-groups/orgs/{org}/.get.parameters[].description
Groups search string. Single string or list of strings. e.g 'sample_group' or `['group', 'another group']` 

# paths./api/ai-analytics/user-groups/orgs/{org}/.get.parameters[].description
Filter for users who have at least an enrollment

# paths./api/ai-analytics/user-groups/orgs/{org}/.get.parameters[].description
Filter by learners date_joined. Start date. ISO 8601

# paths./api/ai-bot/v1/bots/{org}/bot/.get.description
Create modify and update bot information for a specific tenant.

# paths./api/ai-bot/v1/bots/{org}/bot/.post.description
Create modify and update bot information for a specific tenant.

# paths./api/ai-bot/v1/bots/{org}/bot-commands/.get.description
Create slash commands for a specific bot
eg. /iblai-baseline

# paths./api/ai-bot/v1/bots/{org}/bot-commands/.post.description
Create slash commands for a specific bot
eg. /iblai-baseline

# paths./api/ai-bot/v1/bots/{org}/bot-commands/{id}/.get.description
Create slash commands for a specific bot
eg. /iblai-baseline

# paths./api/ai-bot/v1/bots/{org}/bot-commands/{id}/.get.parameters[].description
A unique integer value identifying this bot command.

# paths./api/ai-bot/v1/bots/{org}/bot-commands/{id}/.put.description
Create slash commands for a specific bot
eg. /iblai-baseline

# paths./api/ai-bot/v1/bots/{org}/bot-commands/{id}/.put.parameters[].description
A unique integer value identifying this bot command.

# paths./api/ai-bot/v1/bots/{org}/bot-commands/{id}/.patch.description
Create slash commands for a specific bot
eg. /iblai-baseline

# paths./api/ai-bot/v1/bots/{org}/bot-commands/{id}/.patch.parameters[].description
A unique integer value identifying this bot command.

# paths./api/ai-bot/v1/bots/{org}/bot-commands/{id}/.delete.description
Create slash commands for a specific bot
eg. /iblai-baseline

# paths./api/ai-bot/v1/bots/{org}/bot-commands/{id}/.delete.parameters[].description
A unique integer value identifying this bot command.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/.get.description
Create modify and update bot information for a specific tenant.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/.get.parameters[].description
A unique integer value identifying this bot.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/.put.description
Create modify and update bot information for a specific tenant.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/.put.parameters[].description
A unique integer value identifying this bot.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/.patch.description
Create modify and update bot information for a specific tenant.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/.patch.parameters[].description
A unique integer value identifying this bot.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/.delete.description
Create modify and update bot information for a specific tenant.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/.delete.parameters[].description
A unique integer value identifying this bot.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/config/discord/.get.description
Create modify and update bot information for a specific tenant.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/config/discord/.get.parameters[].description
A unique integer value identifying this bot.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/config/discord/.patch.description
Create modify and update bot information for a specific tenant.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/config/discord/.patch.parameters[].description
A unique integer value identifying this bot.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/config/slack/.get.description
Create modify and update bot information for a specific tenant.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/config/slack/.get.parameters[].description
A unique integer value identifying this bot.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/config/slack/update/.post.description
Create modify and update bot information for a specific tenant.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/config/slack/update/.post.parameters[].description
A unique integer value identifying this bot.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/config/slack/update/.put.description
Create modify and update bot information for a specific tenant.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/config/slack/update/.put.parameters[].description
A unique integer value identifying this bot.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/config/slack/update/.patch.description
Create modify and update bot information for a specific tenant.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/config/slack/update/.patch.parameters[].description
A unique integer value identifying this bot.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/config/teams/.get.description
Create modify and update bot information for a specific tenant.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/config/teams/.get.parameters[].description
A unique integer value identifying this bot.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/config/teams/update/.post.description
Create modify and update bot information for a specific tenant.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/config/teams/update/.post.parameters[].description
A unique integer value identifying this bot.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/config/teams/update/.put.description
Create modify and update bot information for a specific tenant.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/config/teams/update/.put.parameters[].description
A unique integer value identifying this bot.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/config/teams/update/.patch.description
Create modify and update bot information for a specific tenant.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/config/teams/update/.patch.parameters[].description
A unique integer value identifying this bot.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/config/webex/.get.description
Create modify and update bot information for a specific tenant.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/config/webex/.get.parameters[].description
A unique integer value identifying this bot.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/config/webex/.patch.description
Create modify and update bot information for a specific tenant.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/config/webex/.patch.parameters[].description
A unique integer value identifying this bot.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/config/whatsapp/.get.description
Create modify and update bot information for a specific tenant.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/config/whatsapp/.get.parameters[].description
A unique integer value identifying this bot.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/whatsapp-config/.put.description
Create modify and update bot information for a specific tenant.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/whatsapp-config/.put.parameters[].description
A unique integer value identifying this bot.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/whatsapp-config/.patch.description
Create modify and update bot information for a specific tenant.

# paths./api/ai-bot/v1/bots/{org}/bot/{id}/whatsapp-config/.patch.parameters[].description
A unique integer value identifying this bot.

# paths./api/ai-bot/v1/bots/{org}/discord-user-config/.get.description
Setup discord user id linkage with discord bots
this will be used to authenticate the user when interracting with discord bots.
the user id can be copied from the discord app after tapping on the user profile.

# paths./api/ai-bot/v1/bots/{org}/discord-user-config/.post.description
Setup discord user id linkage with discord bots
this will be used to authenticate the user when interracting with discord bots.
the user id can be copied from the discord app after tapping on the user profile.

# paths./api/ai-bot/v1/bots/{org}/discord-user-config/{id}/.get.description
Setup discord user id linkage with discord bots
this will be used to authenticate the user when interracting with discord bots.
the user id can be copied from the discord app after tapping on the user profile.

# paths./api/ai-bot/v1/bots/{org}/discord-user-config/{id}/.get.parameters[].description
A unique integer value identifying this discord user config.

# paths./api/ai-bot/v1/bots/{org}/discord-user-config/{id}/.put.description
Setup discord user id linkage with discord bots
this will be used to authenticate the user when interracting with discord bots.
the user id can be copied from the discord app after tapping on the user profile.

# paths./api/ai-bot/v1/bots/{org}/discord-user-config/{id}/.put.parameters[].description
A unique integer value identifying this discord user config.

# paths./api/ai-bot/v1/bots/{org}/discord-user-config/{id}/.patch.description
Setup discord user id linkage with discord bots
this will be used to authenticate the user when interracting with discord bots.
the user id can be copied from the discord app after tapping on the user profile.

# paths./api/ai-bot/v1/bots/{org}/discord-user-config/{id}/.patch.parameters[].description
A unique integer value identifying this discord user config.

# paths./api/ai-bot/v1/bots/{org}/discord-user-config/{id}/.delete.description
Setup discord user id linkage with discord bots
this will be used to authenticate the user when interracting with discord bots.
the user id can be copied from the discord app after tapping on the user profile.

# paths./api/ai-bot/v1/bots/{org}/discord-user-config/{id}/.delete.parameters[].description
A unique integer value identifying this discord user config.

# paths./api/ai-bot/v1/bots/{org}/slack-user-config/.get.description
Setup slack username and domain linkage with slack bots
this will be used to authenticate the user when interracting with slack bots.

# paths./api/ai-bot/v1/bots/{org}/slack-user-config/.post.description
Setup slack username and domain linkage with slack bots
this will be used to authenticate the user when interracting with slack bots.

# paths./api/ai-bot/v1/bots/{org}/slack-user-config/{id}/.get.description
Setup slack username and domain linkage with slack bots
this will be used to authenticate the user when interracting with slack bots.

# paths./api/ai-bot/v1/bots/{org}/slack-user-config/{id}/.get.parameters[].description
A unique integer value identifying this slack user config.

# paths./api/ai-bot/v1/bots/{org}/slack-user-config/{id}/.put.description
Setup slack username and domain linkage with slack bots
this will be used to authenticate the user when interracting with slack bots.

# paths./api/ai-bot/v1/bots/{org}/slack-user-config/{id}/.put.parameters[].description
A unique integer value identifying this slack user config.

# paths./api/ai-bot/v1/bots/{org}/slack-user-config/{id}/.patch.description
Setup slack username and domain linkage with slack bots
this will be used to authenticate the user when interracting with slack bots.

# paths./api/ai-bot/v1/bots/{org}/slack-user-config/{id}/.patch.parameters[].description
A unique integer value identifying this slack user config.

# paths./api/ai-bot/v1/bots/{org}/slack-user-config/{id}/.delete.description
Setup slack username and domain linkage with slack bots
this will be used to authenticate the user when interracting with slack bots.

# paths./api/ai-bot/v1/bots/{org}/slack-user-config/{id}/.delete.parameters[].description
A unique integer value identifying this slack user config.

# paths./api/ai-bot/v1/bots/{org}/whatsapp-user-config/.get.description
Setup phone number linkage with whatsapp bots
This phone number will be used to authenticate and allow access to whatsapp bots.

# paths./api/ai-bot/v1/bots/{org}/whatsapp-user-config/.post.description
Setup phone number linkage with whatsapp bots
This phone number will be used to authenticate and allow access to whatsapp bots.

# paths./api/ai-bot/v1/bots/{org}/whatsapp-user-config/{id}/.get.description
Setup phone number linkage with whatsapp bots
This phone number will be used to authenticate and allow access to whatsapp bots.

# paths./api/ai-bot/v1/bots/{org}/whatsapp-user-config/{id}/.get.parameters[].description
A unique integer value identifying this whatsapp user config.

# paths./api/ai-bot/v1/bots/{org}/whatsapp-user-config/{id}/.put.description
Setup phone number linkage with whatsapp bots
This phone number will be used to authenticate and allow access to whatsapp bots.

# paths./api/ai-bot/v1/bots/{org}/whatsapp-user-config/{id}/.put.parameters[].description
A unique integer value identifying this whatsapp user config.

# paths./api/ai-bot/v1/bots/{org}/whatsapp-user-config/{id}/.patch.description
Setup phone number linkage with whatsapp bots
This phone number will be used to authenticate and allow access to whatsapp bots.

# paths./api/ai-bot/v1/bots/{org}/whatsapp-user-config/{id}/.patch.parameters[].description
A unique integer value identifying this whatsapp user config.

# paths./api/ai-bot/v1/bots/{org}/whatsapp-user-config/{id}/.delete.description
Setup phone number linkage with whatsapp bots
This phone number will be used to authenticate and allow access to whatsapp bots.

# paths./api/ai-bot/v1/bots/{org}/whatsapp-user-config/{id}/.delete.parameters[].description
A unique integer value identifying this whatsapp user config.

# paths./api/ai-bot/v1/bots/webhooks/{org}/discord/{name}/.post.description
Webhook endpoint to receive and process discord messages.

# paths./api/ai-bot/v1/bots/webhooks/{org}/webex/{name}/.post.description
Webhook endpoint to receive and process discord messages.

# paths./api/ai-bot/v1/bots/webhooks/{org}/whatsapp/{name}/.get.description
Respond to whatsapp's webhook challenge.
Parameters Required include the tenant key (org) and the name of the bot: (name)

# paths./api/ai-bot/v1/bots/webhooks/{org}/whatsapp/{name}/.post.description
Accept and process webhook events from whatsapp.

# paths./api/ai-index/orgs/{org}/users/{user_id}/documents/{document_id}.get.description
Retrieve details of a specific document embedding.

This endpoint returns detailed information about a specific
document embedding identified by its ID.

Args:
    request: The HTTP request.
    org: Organization key identifier.
    document_id: The ID of the document embedding to retrieve.

Returns:
    Response: Detailed information about the document embedding.

Raises:
    NotFound: If the specified document embedding does not exist.

# paths./api/ai-index/orgs/{org}/users/{user_id}/documents/{document_id}.put.description
Update a specific document embedding.

This endpoint allows updating various properties of a document embedding,
including its name, type, pathway, and training status.

Args:
    request: The HTTP request containing the updated document data.
    org: Organization key identifier.
    document_id: The ID of the document embedding to update.

Returns:
    Response: The updated document embedding information.

Raises:
    BadRequest: If the provided data is invalid.
    NotFound: If the specified document embedding does not exist.

# paths./api/ai-index/orgs/{org}/users/{user_id}/documents/{document_id}.delete.description
Delete a specific document embedding.

This endpoint removes a document embedding from the system,
including untraining it from any associated pathways.

Args:
    request: The HTTP request.
    org: Organization key identifier.
    document_id: The ID of the document embedding to delete.

Returns:
    Response: An empty response with a 204 status code if successful.

Raises:
    NotFound: If the specified document embedding does not exist.

# paths./api/ai-index/orgs/{org}/users/{user_id}/documents/{document_id}.get.description
Retrieve document settings with RBAC permission checks.

# paths./api/ai-index/orgs/{org}/users/{user_id}/documents/{document_id}.post.description
Update document settings with RBAC permission checks.

# paths./api/ai-index/orgs/{org}/users/{user_id}/documents/document-from.post.description
Train a document from the document pool

Sample request:
```json
{"document_id": 3, "to_pathway": "7c43ec09-3d37-489c-a461-8d73df1d91c7"}
```

# paths./api/ai-index/orgs/{org}/users/{user_id}/documents/pathways/{pat.get.description
Description:
Retrieves a list of document embeddings for a specific pathway with optional search and pagination.

Methods:
- GET: Retrieves document embeddings that match the specified search criteria and are paginated according to offset and limit.

Parameters:
- search (str): Search query to filter document names or URLs.
- offset (int): Offset number for pagination.
- limit (int): Limit number for pagination.

Returns:
- GET: A paginated list of document embeddings with their details.
{
    "count": 10,
    "next": "http://api.example.com/retriever_documents/?offset=10&limit=2",
    "previous": "http://api.example.com/retriever_documents/?offset=0&limit=2",
    "results": [
    {
        "document_name": "Document2",
        "platform_key": "example_platform",
        "pathway": "example_pathway"
    }
    ]
}

Error Responses:
- 400 Bad Request: Invalid query parameters.
- 404 Not Found: No document embeddings found for the specified criteria.

# paths./api/ai-index/orgs/{org}/users/{user_id}/documents/search/.post.description
Retrieve resource documents similar to the given query.

This endpoint performs a semantic search to find documents that are
relevant to the provided query within the specified pathway.

Args:
    request: The HTTP request containing the search query.
    org: Organization key identifier.

Returns:
    Response: A list of documents relevant to the search query.

Raises:
    ValidationError: If the request data is invalid.

# paths./api/ai-index/orgs/{org}/users/{user_id}/documents/search/.post.responses.200.content.application/json.examples.RetrieverSearchResponse.value.results[].page_content
computational thinking can go from a thought exercise to a practical application when implemented in code.

# paths./api/ai-index/orgs/{org}/users/{user_id}/documents/search/.post.responses.200.content.application/json.examples.RetrieverSearchResponse.value.results[].page_content
Computational thinking involves breaking down complex problems into smaller, more manageable parts.

# paths./api/ai-index/orgs/{org}/users/{user_id}/documents/sources/.post.description
Retrieve document sources related to a given query.

This endpoint performs a semantic search to find document sources
that are relevant to the provided query within the specified pathway,
and returns them along with confidence levels.

Args:
    request: The HTTP request containing the search query.
    org: Organization key identifier.

Returns:
    Response: A list of document sources with confidence levels.

Raises:
    ValidationError: If the request data is invalid.

# paths./api/ai-index/orgs/{org}/users/{user_id}/documents/tasks/{task_i.get.description
Check the status of a document training task.

This endpoint retrieves the current status of an asynchronous
document training task that was previously initiated.

Args:
    request: The HTTP request.
    org: Organization key identifier.
    task_id: The ID of the training task to check.

Returns:
    Response: The current status of the document training task,
             which can be "pending", "completed", or "failed".

# paths./api/ai-index/orgs/{org}/users/{user_id}/documents/tasks/{task_i.get.responses.200.content.application/json.examples.DocumentTrainingStatusResponse-Pending.summary
Document Training Status Response - Pending

# paths./api/ai-index/orgs/{org}/users/{user_id}/documents/tasks/{task_i.get.responses.200.content.application/json.examples.DocumentTrainingStatusResponse-Completed.summary
Document Training Status Response - Completed

# paths./api/ai-index/orgs/{org}/users/{user_id}/documents/tasks/{task_i.get.responses.200.content.application/json.examples.DocumentTrainingStatusResponse-Failed.summary
Document Training Status Response - Failed

# paths./api/ai-index/orgs/{org}/users/{user_id}/documents/train/.post.description
Train a document through a worker process.

This endpoint queues larger documents for training through a worker
process, which is more suitable for handling documents that would
take too long to process directly.

Args:
    request: The HTTP request containing the document information.
    org: Organization key identifier.

Returns:
    Response: A confirmation that the document was queued for training,
             including a task ID for tracking the progress.

Raises:
    ValidationError: If the request data is invalid.
    BadRequest: If there was an error processing the document.

# paths./api/ai-index/orgs/{org}/users/{user_id}/documents/train/.post.responses.200.content.application/json.examples.TrainDocumentResponse.value[].message
Document received. Your request to train is queued

# paths./api/ai-index/orgs/{org}/users/{user_id}/documents/train/retriev.post.description
Train a document directly without using a worker.

This endpoint is designed for training smaller documents directly
without queuing them through a worker process. For larger documents,
use the TrainDocumentView endpoint instead.

Args:
    request: The HTTP request containing the document information.
    org: Organization key identifier.

Returns:
    Response: A confirmation that the document was trained successfully.

Raises:
    ValidationError: If the request data is invalid.
    BadRequest: If the document training failed.

# paths./api/ai-index/orgs/{org}/users/{user_id}/resource/{resource_id}/.get.description
Retrieve detailed information about a specific scraped resource.

This endpoint returns the complete scraped data for a specific resource
identified by its ID.

Args:
    request: The HTTP request.
    org: Organization key identifier.
    user_id: The username of the user associated with the resource.
    resource_id: The ID of the resource to retrieve.

Returns:
    Response: The complete scraped data for the specified resource.

Raises:
    NotFound: If the specified resource data does not exist.

# paths./api/ai-index/orgs/{org}/users/{user_id}/resource/{resource_id}/.get.responses.200.content.application/json.examples.ResourceScrappedDataDetailResponse.value.content
Machine learning is a field of study that gives computers the ability to learn without being explicitly programmed...

# paths./api/ai-index/orgs/{org}/users/{user_id}/resource/{resource_id}/.get.responses.200.content.application/json.examples.ResourceScrappedDataDetailResponse.value.extra_data.description
A comprehensive guide to machine learning concepts and applications

# paths./api/ai-index/orgs/{org}/users/{user_id}/resource/data/scrapped/.get.description
Retrieve and filter scraped data from resources.

This endpoint returns a list of scraped data from resources associated
with the specified user, with optional filtering based on query parameters.

Args:
    request: The HTTP request containing filter query parameters.
    org: Organization key identifier.
    user_id: The username of the user whose resources to retrieve.

Returns:
    Response: A list of scraped resource data matching the filter criteria.

Raises:
    BadRequest: If the username is invalid or query parameters are incorrect.

# paths./api/ai-index/webhook/scan/.post.description
Receive and process file scan status from external security scanning services.

This webhook endpoint receives scan results for files that have been submitted
for security scanning. It processes the results asynchronously and determines
if the files are safe for further processing.

Args:
    request: The HTTP request containing scan result data.

Returns:
    Response: A confirmation that the scan result was received and is being processed.

Raises:
    BadRequest: If the provided scan result data is invalid.

# paths./api/ai-index/webhook/scan/.post.responses.200.content.application/json.examples.ScanWebhookResponse.value.message
Scan result received. Processing in background.

# paths./api/ai-marketing/orgs/{org}/users/{user_id}/heygen-videos/.get.description
Mixin that includes the StudentTokenAuthentication and IsPlatformAdmin

# paths./api/ai-marketing/orgs/{org}/users/{user_id}/heygen-videos/.get.parameters[].description
A page number within the paginated result set.

# paths./api/ai-marketing/orgs/{org}/users/{user_id}/heygen-videos/.post.description
Mixin that includes the StudentTokenAuthentication and IsPlatformAdmin

# paths./api/ai-marketing/orgs/{org}/users/{user_id}/heygen-videos/{name.get.description
Mixin that includes the StudentTokenAuthentication and IsPlatformAdmin

# paths./api/ai-media/orgs/{org}/users/{user_id}/heygen/templates/.get.description
API view to list or append Heygen template ids for a tenant.

# paths./api/ai-media/orgs/{org}/users/{user_id}/heygen/templates/.get.parameters[].description
A page number within the paginated result set.

# paths./api/ai-media/orgs/{org}/users/{user_id}/heygen/templates/.post.description
Endpoint to add a Heygen template id to an org.

Only platform admins have access to this endpoint.

# paths./api/ai-media/orgs/{org}/users/{user_id}/heygen/templates/{templ.delete.description
Endpoint to delete a Heygen template id for an org.


The reponse status code is always 204 when no error.


Only platform admins have access to this endpoint.

# paths./api/ai-media/orgs/{org}/users/{user_id}/heygen/video-captions/{.get.description
Endpoint to download caption for a video.

# paths./api/ai-media/orgs/{org}/users/{user_id}/heygen/video-captions/{.post.description
Endpoint to upload a new caption for a generated video.

Only platform admins have access to this endpoint.

# paths./api/ai-media/orgs/{org}/users/{user_id}/heygen/video-download/{.get.description
Endpoint used to download a heygen video.


Only platform admins have access to this endpoint.

# paths./api/ai-media/orgs/{org}/users/{user_id}/heygen/videos/.get.description
Mixin that includes the StudentTokenAuthentication and IsPlatformAdmin

# paths./api/ai-media/orgs/{org}/users/{user_id}/heygen/videos/.get.parameters[].description
A page number within the paginated result set.

# paths./api/ai-media/orgs/{org}/users/{user_id}/heygen/videos/.post.description
Endpoint to create a Heygen video

Only platform admins have access to this endpoint.

# paths./api/ai-media/orgs/{org}/users/{user_id}/heygen/videos/{heygen_m.get.description
Mixin that includes the StudentTokenAuthentication and IsPlatformAdmin

# paths./api/ai-media/orgs/{org}/users/{user_id}/heygen/videos/{heygen_m.delete.description
Endpoint used to delete a heygen video.

Only platform admins have access to this endpoint.

# paths./api/ai-media/orgs/{org}/users/{user_id}/veo/video-download/{veo.get.description
Endpoint used to download a Veo video.


Only platform admins have access to this endpoint.

# paths./api/ai-media/orgs/{org}/users/{user_id}/veo/videos/.get.description
Mixin that includes the StudentTokenAuthentication and IsPlatformAdmin

# paths./api/ai-media/orgs/{org}/users/{user_id}/veo/videos/.get.parameters[].description
A page number within the paginated result set.

# paths./api/ai-media/orgs/{org}/users/{user_id}/veo/videos/.post.description
Endpoint to create a Veo3 video

Only platform admins have access to this endpoint.

# paths./api/ai-media/orgs/{org}/users/{user_id}/veo/videos/{veo_video_i.get.description
Mixin that includes the StudentTokenAuthentication and IsPlatformAdmin

# paths./api/ai-media/orgs/{org}/users/{user_id}/veo/videos/{veo_video_i.delete.description
Endpoint used to delete a veo3 video.

Only platform admins have access to this endpoint.

# paths./api/ai-media/orgs/{org}/users/{user_id}/video-script-generation.post.description
Endpoint to generate video scripts from a audio file. The audio file can be one of mp3 and wav.

The request should be a multipart form with your audio file in the `file` field.

Initial Response:
```
{"script": None, "status": "started_generation", "generation_id": "your-generation-id."}
```
This signals the generation has started. You can use the generation id to query video script generation status from this endpoint, using a JSON like below:
```
{"generation_id": "your-generation-id"}
```

Example response:
```
{"script": "hello this is a video script.", "status": "finished", "generation_id": "your-generation-id"}

```

# paths./api/ai-media/orgs/{org}/users/{user_id}/video-script-generation.post.description
    Endpoint to generate video scripts from a document file. The document file can be one of docx, doc, pptx, ppt, txt and pdf.

    The request should be a multipart form with your document file in the `file` field.
Initial Response:
    ```
    {"script": None, "status": "started_generation", "generation_id": "your-generation-id."}
    ```
    This signals the generation has started. You can use the generation id to query video script generation status from this endpoint, using a JSON like below:
    ```
    {"generation_id": "your-generation-id"}
    ```

    Example response:
    ```
    {"script": "hello this is a video script.", "status": "finished", "generation_id": "your-generation-id"}

    ```

# paths./api/ai-media/orgs/{org}/users/{user_id}/video-script-generation.post.description
Endpoint to generate video scripts from a text.

The request body should be a JSON with your text, like below:
```
{"text": "Generate a script about a campus comedy."}
```

Example response:
```
{"script": "hello this is a video script."}

```

# paths./api/ai-mentor/claw/health/.get.description
Public health endpoint for external monitoring (Pingdom, uptime checks).

Scoped to managed workers (the infrastructure we operate): returns 500 when a managed,
non-inactive worker is in error OR its stored TLS certificate is within the near-expiry
threshold; 200 otherwise. Near-expiry is computed at read time and never stored as an error,
so it cannot block student routing. Self-hosted workers are the tenant's infrastructure and
do not drive this alert. Pure DB read, no external calls.

# paths./api/ai-mentor/claw/health/detail/.get.description
Detailed health dashboard for DM admins.

Returns health status for all Claw instances across all orgs,
including instance details and enabled mentor counts.

# paths./api/ai-mentor/langfuse/health/.get.description
Proxy endpoint to check for langfuse health status

# paths./api/ai-mentor/orgs/{org}/agent-skill-resources/.get.parameters[].description
* `script` - Script
* `reference` - Reference
* `asset` - Asset

# paths./api/ai-mentor/orgs/{org}/agent-skill-resources/.get.parameters[].description
The initial index from which to return the results.

# paths./api/ai-mentor/orgs/{org}/agent-skill-resources/{id}/.get.parameters[].description
A unique integer value identifying this Agent skill resource.

# paths./api/ai-mentor/orgs/{org}/agent-skill-resources/{id}/.put.parameters[].description
A unique integer value identifying this Agent skill resource.

# paths./api/ai-mentor/orgs/{org}/agent-skill-resources/{id}/.patch.parameters[].description
A unique integer value identifying this Agent skill resource.

# paths./api/ai-mentor/orgs/{org}/agent-skill-resources/{id}/.delete.parameters[].description
A unique integer value identifying this Agent skill resource.

# paths./api/ai-mentor/orgs/{org}/agent-skills/.get.parameters[].description
The initial index from which to return the results.

# paths./api/ai-mentor/orgs/{org}/agent-skills/{id}/.get.parameters[].description
A unique integer value identifying this Agent skill.

# paths./api/ai-mentor/orgs/{org}/agent-skills/{id}/.put.parameters[].description
A unique integer value identifying this Agent skill.

# paths./api/ai-mentor/orgs/{org}/agent-skills/{id}/.patch.parameters[].description
A unique integer value identifying this Agent skill.

# paths./api/ai-mentor/orgs/{org}/agent-skills/{id}/.delete.parameters[].description
A unique integer value identifying this Agent skill.

# paths./api/ai-mentor/orgs/{org}/all-triggers/.get.description
List all triggers for an organization.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.

Returns:
    Response: A list of trigger slugs for the organization.

Raises:
    BadRequest: If the request is invalid.

# paths./api/ai-mentor/orgs/{org}/claw/instances/.get.parameters[].description
The initial index from which to return the results.

# paths./api/ai-mentor/orgs/{org}/claw/instances/.get.parameters[].description
* `active` - Active
* `inactive` - Inactive
* `error` - Error

# paths./api/ai-mentor/orgs/{org}/claw/instances/{id}/.get.parameters[].description
A unique integer value identifying this Claw instance.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{id}/.put.parameters[].description
A unique integer value identifying this Claw instance.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{id}/.patch.parameters[].description
A unique integer value identifying this Claw instance.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{id}/.delete.parameters[].description
A unique integer value identifying this Claw instance.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{id}/health-check/.post.description
Queue a health check against the Claw instance.

Offloaded to Celery because the real health check uses a WebSocket
handshake + RPC, which blocks gevent workers (sockets are not
monkey-patched). The task updates the server's health fields on
completion.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{id}/health-check/.post.parameters[].description
A unique integer value identifying this Claw instance.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{id}/push-providers/.post.description
Push all enabled model providers to the worker.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{id}/push-providers/.post.parameters[].description
A unique integer value identifying this Claw instance.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{id}/refresh-version/.post.description
Connect to the worker and store Claw version from handshake.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{id}/refresh-version/.post.parameters[].description
A unique integer value identifying this Claw instance.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{id}/request-pairing/.post.description
Queue a device-pairing request against the worker (#1848).

The connect handshake is a WebSocket + RPC round-trip that blocks gevent web workers, so it is
offloaded to Celery rather than run inline. The task mints a pending pairing request (expires
~5 min) and writes the result (request id + fingerprint, already-paired, or error) to the
instance's ``last_pairing`` field; an operator then approves the request id on the worker host.
This endpoint never approves — approval stays explicit and operator-gated.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{id}/request-pairing/.post.parameters[].description
A unique integer value identifying this Claw instance.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{id}/security-audit/.post.description
Run security audit on the worker and store findings.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{id}/security-audit/.post.parameters[].description
A unique integer value identifying this Claw instance.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{id}/test-connectivity/.post.description
Check connectivity to the Claw instance: TLS reachability + health check.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{id}/test-connectivity/.post.parameters[].description
A unique integer value identifying this Claw instance.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{id}/usage/.get.description
Return per-tenant usage snapshot.

Cost fields are stripped on managed instances so we don't expose
our LLM-provider cost basis to the customer. Self-hosted instances
return the full payload (the customer pays the LLM bill).
Non-OpenClaw instances return 400 — IronClaw / NemoClaw don't
expose the same usage RPCs.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{id}/usage/.get.parameters[].description
A unique integer value identifying this Claw instance.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{id}/usage/full/.get.description
Return unredacted usage snapshot — DM superadmin only.

Always includes all cost fields regardless of provision_mode.
Tenants do not see this surface; the tenant-facing
``/usage`` endpoint handles per-platform redaction.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{id}/usage/full/.get.parameters[].description
A unique integer value identifying this Claw instance.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{server_pk}/config/.get.description
Returns the openclaw.json snapshot from the worker, with secret values replaced by the literal `__OPENCLAW_REDACTED__` sentinel. The `hash` field is the optimistic-concurrency token required by subsequent `PATCH config/` calls.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{server_pk}/config/.patch.description
Deep-merges the supplied `patch` into the current openclaw.json.  Nulls delete keys, arrays replace wholesale.  Pass `__OPENCLAW_REDACTED__` at a secret path to leave the secret unchanged.  Rate limit: 3 writes / 60 s per deviceId+clientIp on the worker.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{server_pk}/cron-jobs/.get.description
Manage scheduled cron jobs on a ClawInstance.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{server_pk}/cron-jobs/.get.parameters[].description
* `all` - all
* `enabled` - enabled
* `disabled` - disabled

# paths./api/ai-mentor/orgs/{org}/claw/instances/{server_pk}/cron-jobs/.get.parameters[].description
* `nextRunAtMs` - nextRunAtMs
* `updatedAtMs` - updatedAtMs
* `name` - name

# paths./api/ai-mentor/orgs/{org}/claw/instances/{server_pk}/cron-jobs/.post.description
Sends `cron.add` to the worker.  Required scope: `operator.admin`.  The worker echoes back the assigned `jobId`.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{server_pk}/cron-jobs/{.put.description
Manage scheduled cron jobs on a ClawInstance.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{server_pk}/cron-jobs/{.patch.description
Forwards the body verbatim as `cron.update.params.patch`.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{server_pk}/cron-jobs/{.delete.description
Manage scheduled cron jobs on a ClawInstance.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{server_pk}/cron-jobs/{.post.description
Calls `cron.run` on the worker.  Mode `force` (default) runs unconditionally; `due` only runs if the schedule says it's due.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{server_pk}/cron-runs/.get.parameters[].description
* `delivered` - delivered
* `not-delivered` - not-delivered
* `unknown` - unknown
* `not-requested` - not-requested

# paths./api/ai-mentor/orgs/{org}/claw/instances/{server_pk}/cron-runs/.get.parameters[].description
* `all` - all
* `ok` - ok
* `error` - error
* `skipped` - skipped

# paths./api/ai-mentor/orgs/{org}/claw/instances/{server_pk}/cron-status.get.description
Returns the worker's `cron.status` summary.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{server_pk}/mcp-servers.get.description
Reads `mcp.servers.*` from the worker config and returns each entry's name + config.  Secret values are surfaced as `__OPENCLAW_REDACTED__`.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{server_pk}/mcp-servers.get.summary
List MCP servers configured on this ClawInstance

# paths./api/ai-mentor/orgs/{org}/claw/instances/{server_pk}/mcp-servers.post.description
Inserts a new entry at `mcp.servers.<name>` and writes the full config back via `config.set` with the current `baseHash`.  Fails with 409 if the name already exists.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{server_pk}/mcp-servers.get.description
Manage MCP server entries on a ClawInstance.

All operations round-trip the worker's config (read → modify → write
with baseHash), so existing entries — including
`__OPENCLAW_REDACTED__` secret placeholders — are preserved verbatim.
The canonical config path is `mcp.servers.<name>`.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{server_pk}/mcp-servers.put.description
Manage MCP server entries on a ClawInstance.

All operations round-trip the worker's config (read → modify → write
with baseHash), so existing entries — including
`__OPENCLAW_REDACTED__` secret placeholders — are preserved verbatim.
The canonical config path is `mcp.servers.<name>`.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{server_pk}/mcp-servers.patch.description
Deep-merges the `config` patch into the existing entry, preserving fields the caller didn't supply — including redacted secret values.  Set `replace=true` for a full overwrite of the entry.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{server_pk}/mcp-servers.patch.summary
Update an MCP server (deep-merge by default)

# paths./api/ai-mentor/orgs/{org}/claw/instances/{server_pk}/mcp-servers.delete.description
Manage MCP server entries on a ClawInstance.

All operations round-trip the worker's config (read → modify → write
with baseHash), so existing entries — including
`__OPENCLAW_REDACTED__` secret placeholders — are preserved verbatim.
The canonical config path is `mcp.servers.<name>`.

# paths./api/ai-mentor/orgs/{org}/claw/instances/{server_pk}/wake/.post.description
Sends the `wake` RPC.  `mode="now"` (default) injects immediately; `mode="next-heartbeat"` defers until the next heartbeat.  Required scope: `operator.write`.

# paths./api/ai-mentor/orgs/{org}/claw/model-providers/.get.parameters[].description
The initial index from which to return the results.

# paths./api/ai-mentor/orgs/{org}/claw/model-providers/{id}/.get.parameters[].description
A unique integer value identifying this Claw model provider.

# paths./api/ai-mentor/orgs/{org}/claw/model-providers/{id}/.put.parameters[].description
A unique integer value identifying this Claw model provider.

# paths./api/ai-mentor/orgs/{org}/claw/model-providers/{id}/.patch.parameters[].description
A unique integer value identifying this Claw model provider.

# paths./api/ai-mentor/orgs/{org}/claw/model-providers/{id}/.delete.parameters[].description
A unique integer value identifying this Claw model provider.

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_id}/memory-categories/.get.description
List all active memory categories for a mentor.

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/agent-confi.get.description
Singular AgentConfig nested under a mentor. GET + PATCH only.

AgentConfig is auto-created by ClawMentorConfig.save(); if a mentor has
never had a ClawMentorConfig, PATCH will create the AgentConfig on first
write via get_or_create. DELETE is not supported (the row would be
immediately recreated by a subsequent ClawMentorConfig.save).

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/agent-confi.patch.description
Singular AgentConfig nested under a mentor. GET + PATCH only.

AgentConfig is auto-created by ClawMentorConfig.save(); if a mentor has
never had a ClawMentorConfig, PATCH will create the AgentConfig on first
write via get_or_create. DELETE is not supported (the row would be
immediately recreated by a subsequent ClawMentorConfig.save).

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/claw-config.get.description
Singular ClawMentorConfig nested under a mentor.

Supports GET/POST/PATCH/DELETE plus the push-config/ custom action.
POST creates the (one and only) ClawMentorConfig for this mentor — the
OneToOne(Mentor) constraint means a duplicate POST returns 400.

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/claw-config.post.description
Singular ClawMentorConfig nested under a mentor.

Supports GET/POST/PATCH/DELETE plus the push-config/ custom action.
POST creates the (one and only) ClawMentorConfig for this mentor — the
OneToOne(Mentor) constraint means a duplicate POST returns 400.

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/claw-config.put.description
Singular ClawMentorConfig nested under a mentor.

Supports GET/POST/PATCH/DELETE plus the push-config/ custom action.
POST creates the (one and only) ClawMentorConfig for this mentor — the
OneToOne(Mentor) constraint means a duplicate POST returns 400.

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/claw-config.patch.description
Singular ClawMentorConfig nested under a mentor.

Supports GET/POST/PATCH/DELETE plus the push-config/ custom action.
POST creates the (one and only) ClawMentorConfig for this mentor — the
OneToOne(Mentor) constraint means a duplicate POST returns 400.

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/claw-config.delete.description
Singular ClawMentorConfig nested under a mentor.

Supports GET/POST/PATCH/DELETE plus the push-config/ custom action.
POST creates the (one and only) ClawMentorConfig for this mentor — the
OneToOne(Mentor) constraint means a duplicate POST returns 400.

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/claw-config.post.description
Push agent_config to the Claw worker. RBAC enforced in initial().

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/grader-conf.get.description
Return the mentor's grader configuration.

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/grader-conf.post.description
Create the grader configuration for a mentor. Fails with 400 if a configuration already exists (the resource is 1:1 with the mentor). Criteria are added separately via the nested `criteria/` endpoints.

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/grader-conf.post.responses.400.description
Invalid data, or grader config already exists for this mentor

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/grader-conf.put.description
Replace all writable fields on the grader configuration.

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/grader-conf.patch.description
Update one or more writable fields on the grader configuration.

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/grader-conf.patch.summary
Partially update mentor grader configuration

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/grader-conf.get.description
List the criteria attached to the mentor's grader configuration. Supports `search` against the criterion `name` field.

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/grader-conf.get.parameters[].description
The initial index from which to return the results.

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/grader-conf.post.description
Add a criterion to the mentor's grader configuration. `points` must be a positive float; the overall score is computed as earned points / total possible points (no sum-to-1 invariant).

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/grader-conf.get.responses.404.description
Mentor, grader config, or criterion not found

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/grader-conf.put.description
Replace all writable fields on a criterion.

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/grader-conf.put.responses.404.description
Mentor, grader config, or criterion not found

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/grader-conf.patch.description
Update one or more writable fields on a criterion.

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/grader-conf.patch.responses.404.description
Mentor, grader config, or criterion not found

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/grader-conf.delete.description
Delete a criterion. Refuses with 400 if it is the only remaining criterion on the config — a config with zero criteria cannot grade.

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/grader-conf.delete.responses.400.description
Cannot delete the last criterion — a grader config must have at least one

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/grader-conf.delete.responses.404.description
Mentor, grader config, or criterion not found

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/lti/grant-m.post.description
Grants a user Student type access to a mentor that is lti accessible.

Creates or updates an RBAC policy named LTI-{mentor.unique_id} with the global Student role,
granting the specified user access to the mentor. Validates that the mentor has LTI access
enabled and that the user belongs to the specified platform.

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/lti/grant-m.post.responses.204.description
User already has access, no changes made

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/skills/.get.description
Skill assignments nested under a mentor. Full CRUD.

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/skills/.get.parameters[].description
The initial index from which to return the results.

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/skills/.post.description
Skill assignments nested under a mentor. Full CRUD.

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/skills/{ass.get.description
Skill assignments nested under a mentor. Full CRUD.

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/skills/{ass.put.description
Skill assignments nested under a mentor. Full CRUD.

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/skills/{ass.patch.description
Skill assignments nested under a mentor. Full CRUD.

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor_unique_id}/skills/{ass.delete.description
Skill assignments nested under a mentor. Full CRUD.

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor}/email-inbox/.get.description
Retrieve a list of emails in a mentor's inbox.

The list can be filtered using the 'search' query parameter to search
for specific terms in the email content or subject.

Args:
    mentor: The unique identifier of the mentor.

Returns:
    Response: A paginated list of emails in the mentor's inbox.

Raises:
    NotFound: If the specified mentor does not exist.

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor}/email-inbox/.get.parameters[].description
A page number within the paginated result set.

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor}/email-inbox/.get.parameters[].description
Search term to filter emails by content or subject

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor}/email-inbox/.get.responses.200.content.application/json.examples.EmailInboxResponseExample.value.results[][].content_summary
Hello, I have a question about implementing neural networks...

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor}/email-inbox/.get.responses.200.content.application/json.examples.EmailInboxResponseExample.value.results[][].content_summary
I'm trying to debug this Python function...

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor}/email-inbox-summary/.get.description
Retrieve a summary of a mentor's email inbox.

Args:
    request: The HTTP request.
    mentor: The unique identifier of the mentor.

Returns:
    Response: A summary of the mentor's email inbox statistics.

Raises:
    NotFound: If the specified mentor does not exist.

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor}/email-inbox/{email_pr.get.description
Retrieve details of a specific email in a mentor's inbox.

Args:
    request: The HTTP request.
    email_prompt_id: The ID of the email to retrieve.

Returns:
    Response: The detailed information about the email.

Raises:
    NotFound: If the specified email does not exist.

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor}/email-inbox/{email_pr.get.responses.200.content.application/json.examples.EmailDetailResponseExample.value.content
Hello, I have a question about implementing neural networks...

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor}/email-inbox/{email_pr.get.responses.200.content.application/json.examples.EmailDetailResponseExample.value.mentor_response
Thanks for your question. I don't know about it either. Thank you.

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor}/link-course/.get.description
API endpoint to link mentor with a course and enable guided mode.

Permissions:
    - Accessible to tenant admins.

# paths./api/ai-mentor/orgs/{org}/mentors/{mentor}/link-course/.post.description
API endpoint to link mentor with a course and enable guided mode.

Permissions:
    - Accessible to tenant admins.

# paths./api/ai-mentor/orgs/{org}/mentors/by-email/.post.description
Returns a list of mentor unique IDs that a user can access via email in the specified organization.

# paths./api/ai-mentor/orgs/{org}/mentors/by-email/.post.responses.404.content.application/json.examples.UserNotFound.value.error
User with id 123 not found by email in platform

# paths./api/ai-mentor/orgs/{org}/metadata/.post.description
Create or update metadata for a mentor.

Args:
    request: The HTTP request containing the metadata.
    org: The organization/tenant identifier.

Returns:
    Response: The created or updated mentor metadata.

Raises:
    BadRequest: If the provided data is invalid.

# paths./api/ai-mentor/orgs/{org}/offline/mentors/{mentor_unique_id}/con.get.description
Retrieve mentor configuration for offline use.

Returns the same data as the mentor settings endpoint, including
system_prompt, LLM config, safety/moderation settings, and UI settings.

Args:
    request: The HTTP request.
    org: Organization/platform key.
    mentor_unique_id: The unique ID (UUID) of the mentor.

Returns:
    Response: Full mentor settings data.

# paths./api/ai-mentor/orgs/{org}/offline/mentors/{mentor_unique_id}/dat.get.description
Retrieve paginated list of documents for offline use.

Args:
    request: The HTTP request.
    org: Organization/platform key.
    mentor_unique_id: The unique ID (UUID) of the mentor.

Query Parameters:
    limit: Number of results per page (default: 100, max: 500).
    offset: Number of results to skip.
    search: Optional search filter for document_name or url.

Returns:
    Response: Paginated list of documents with S3 URLs.

# paths./api/ai-mentor/orgs/{org}/offline/mentors/{mentor_unique_id}/dat.get.parameters[].description
Number of results per page (default: 100, max: 500)

# paths./api/ai-mentor/orgs/{org}/offline/mentors/{mentor_unique_id}/dat.get.parameters[].description
Number of results to skip for pagination

# paths./api/ai-mentor/orgs/{org}/offline/mentors/{mentor_unique_id}/dat.get.parameters[].description
Search query to filter documents by name or URL

# paths./api/ai-mentor/orgs/{org}/projects/.get.description
Retrieve a list of projects with optional filtering and search.

# paths./api/ai-mentor/orgs/{org}/projects/.get.parameters[].description
The initial index from which to return the results.

# paths./api/ai-mentor/orgs/{org}/projects/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/ai-mentor/orgs/{org}/projects/.get.parameters[].description
Order by field (prefix with - for descending). Example: name or -created_at

# paths./api/ai-mentor/orgs/{org}/projects/.get.responses.200.content.application/json.examples.ProjectsListExample.value.results[][].description
A collection of mentors for learning Python

# paths./api/ai-mentor/orgs/{org}/projects/.post.description
Create a new project with optional mentors.

# paths./api/ai-mentor/orgs/{org}/projects/.post.requestBody.content.application/json.examples.CreateProjectRequest.value.description
A project for learning machine learning fundamentals

# paths./api/ai-mentor/orgs/{org}/projects/.post.responses.201.content.application/json.examples.CreateProjectResponse.value.description
A project for learning machine learning fundamentals

# paths./api/ai-mentor/orgs/{org}/projects/{id}/.get.description
Get detailed information about a specific project including its mentors.

# paths./api/ai-mentor/orgs/{org}/projects/{id}/.put.description
Update project information and optionally modify its mentors.

# paths./api/ai-mentor/orgs/{org}/projects/{id}/.patch.description
API ViewSet for managing projects.

Projects are groups of mentors that can be created by anyone (students and tenant admins).
They serve as a way to organize and group related mentors together.

Projects can be:
- Personal (shared=False): Only visible to their owners
- Shared (shared=True): Visible to platform admins and potentially other users

Projects are accessed through integrated URLs within the mentor router:
    /orgs/<org>/projects/ - All accessible projects in a platform (admin access)
    /orgs/<org>/projects/<id>/ - Specific project (admin access)
    /orgs/<org>/users/<user_id>/projects/ - User's projects (user access)
    /orgs/<org>/users/<user_id>/projects/<id>/ - User's specific project

Query Parameters:
    - username: Filter projects by owner's username (admin routes only)
    - shared: Filter by shared status (true/false)
    - search: Search in name and description
    - sort: Order by field (prefix with - for descending). Example: sort=name or sort=-created_at

Permissions:
    - GET: Accessible to project owners and platform admins (for shared projects)
    - POST: Any authenticated user can create projects
    - PUT, PATCH, DELETE: Accessible to project owners only

# paths./api/ai-mentor/orgs/{org}/quiz-customizer/.get.description
Retrieve existing questions.

Args:
    request: The HTTP request.

Returns:
    Response: The existing questions.

# paths./api/ai-mentor/orgs/{org}/quiz-customizer/.post.description
Generate follow-up questions based on initial questions.

Args:
    request: The HTTP request containing the initial questions.

Returns:
    Response: The generated follow-up questions.

Raises:
    BadRequest: If the provided data is invalid.

# paths./api/ai-mentor/orgs/{org}/quiz-customizer/.post.responses.200.content.application/json.examples.GenerateQuestionsResponseExample.value.questions[].text
What are the main types of machine learning?

# paths./api/ai-mentor/orgs/{org}/sessions/.post.description
Retrieve or create a chat session with a mentor.

Passing `null` as `tools` results in using all tools assigned to the mentor.
To specify that no tools be used, pass an empty list.

Args:
    request: HTTP request containing mentor details.
    org: Organization key identifier.
    user_id (optional): Username for authentication (if required by the mentor).

Returns:
    Response: JSON object containing the session ID.

Raises:
    Http404: If the mentor is not found.
    ValidationError: If the username is invalid.
    ValidationError: If one or more tool slugs are invalid.

# paths./api/ai-mentor/orgs/{org}/sessions/.post.responses.200.content.application/json.examples.SuccessfulResponse.value.tools[].description
Tool to search for information from the web

# paths./api/ai-mentor/orgs/{org}/trigger/.post.description
Create or modify a trigger.

Args:
    request: The HTTP request containing the trigger data.
    org: The organization/tenant identifier.

Returns:
    Response: The created or updated trigger details.

Raises:
    BadRequest: If the provided data is invalid or missing required parameters.

# paths./api/ai-mentor/orgs/{org}/trigger/.post.responses.400.description
Invalid data or missing required parameters

# paths./api/ai-mentor/orgs/{org}/trigger-templates/.get.description
Retrieve available trigger templates.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.

Returns:
    Response: A dictionary of available trigger templates and their required parameters.

Raises:
    BadRequest: If the request is invalid.

# paths./api/ai-mentor/orgs/{org}/trigger-templates/.get.responses.200.description
Dictionary of trigger templates and their required parameters

# paths./api/ai-mentor/orgs/{org}/trigger/{slug}/.get.description
Retrieve details of a specific trigger.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    slug: The unique slug identifier of the trigger.

Returns:
    Response: The details of the specified trigger.

Raises:
    Http404: If the specified trigger does not exist.

# paths./api/ai-mentor/orgs/{org}/trigger/{slug}/deletion/.post.description
Delete a specific trigger.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    slug: The unique slug identifier of the trigger to delete.

Returns:
    Response: A confirmation of the deletion status.

Raises:
    BadRequest: If the specified trigger does not exist.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/.get.description
Retrieve a list of mentors.

Returns:
    - List of mentors matching the filters.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/.get.parameters[].description
Filter options include, date, name, default is date 

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/.get.parameters[].description
A page number within the paginated result set.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/.get.parameters[].description
Declares if session information should be included in the mentor data

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/.post.description
Create a new mentor.
Body Parameters:
    - name: Mentor name.
    - unique_id: Unique identifier.
    - platform_key: Associated platform.
    - metadata: Additional mentor attributes.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/.post.parameters[].description
Filter options include, date, name, default is date 

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/.post.parameters[].description
Declares if session information should be included in the mentor data

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/{name}/.get.description
API ViewSet for managing mentors.

Provides endpoints to retrieve, create, update, and delete mentor data.

Permissions:
    - Accessible to both tenant admins and students.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/{name}/.get.parameters[].description
Filter options include, date, name, default is date 

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/{name}/.get.parameters[].description
Declares if session information should be included in the mentor data

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/{name}/.put.description
Update a mentor's details with RBAC enforcement and custom serializer handling.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/{name}/.put.parameters[].description
Filter options include, date, name, default is date 

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/{name}/.put.parameters[].description
Declares if session information should be included in the mentor data

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/{name}/.patch.description
API ViewSet for managing mentors.

Provides endpoints to retrieve, create, update, and delete mentor data.

Permissions:
    - Accessible to both tenant admins and students.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/{name}/.patch.parameters[].description
Filter options include, date, name, default is date 

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/{name}/.patch.parameters[].description
Declares if session information should be included in the mentor data

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/{name}/.delete.parameters[].description
Filter options include, date, name, default is date 

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/{name}/.delete.parameters[].description
Declares if session information should be included in the mentor data

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/ai-generated-images/.get.description
Endpoint to view and delete AI generated images for a user.

AI Generated images are images generated during chat with AI. They are cached to allow retrieval and deletion.

optional filtering parameters allowed are
- username: The username of the user for which this image was stored.
- provider: The provider used to generate the image. eg. openai, nvidia (nim), replicate.
- model: the text to image model on the provider used to generate the image.

This endpoint is accessible to both students and platform admins.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/ai-generated-images/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/ai-generated-images/.get.parameters[].description
A page number within the paginated result set.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/ai-generated-images/{i.get.description
Endpoint to view and delete AI generated images for a user.

AI Generated images are images generated during chat with AI. They are cached to allow retrieval and deletion.

optional filtering parameters allowed are
- username: The username of the user for which this image was stored.
- provider: The provider used to generate the image. eg. openai, nvidia (nim), replicate.
- model: the text to image model on the provider used to generate the image.

This endpoint is accessible to both students and platform admins.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/ai-generated-images/{i.get.parameters[].description
A unique integer value identifying this ai generated image.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/ai-generated-images/{i.delete.description
Endpoint to view and delete AI generated images for a user.

AI Generated images are images generated during chat with AI. They are cached to allow retrieval and deletion.

optional filtering parameters allowed are
- username: The username of the user for which this image was stored.
- provider: The provider used to generate the image. eg. openai, nvidia (nim), replicate.
- model: the text to image model on the provider used to generate the image.

This endpoint is accessible to both students and platform admins.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/ai-generated-images/{i.delete.parameters[].description
A unique integer value identifying this ai generated image.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/ai-user-profile-memory.get.description
Endpoint to get a list of AI user profile memory entries or to add an entry.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/ai-user-profile-memory.post.description
Endpoint to create an AI user profile memory entry.

Sample request:
```
{"favorite-animal": "my favorite animal is cat"}
```
Sample Response (the same as request data):
```
{"favorite-animal": "my favorite animal is cat"}
```

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/ai-user-profile-memory.delete.description
The endpoint to delete an AI user profile memory entry.

No query parameters or JSON parameters are required.

The response is always empty. Successful request will be responded with status 204, and failed request will be responded with status 404.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/artifacts/.get.description
Retrieve a paginated list of artifacts for a user, with optional filtering and search.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/artifacts/.get.parameters[].description
Filter by file extension (e.g., 'py', 'md', 'html')

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/artifacts/.get.parameters[].description
Filter by LLM name (e.g., 'gpt-4', 'claude-3')

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/artifacts/.get.parameters[].description
Filter by LLM provider (e.g., 'openai', 'anthropic')

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/artifacts/.get.parameters[].description
Order by field (prefix with - for descending). Options: date_created, date_updated, title

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/artifacts/.post.description
Artifacts cannot be created via API. They are created by LLMs via chat messages.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/artifacts/{id}/.get.description
Get detailed information about a specific artifact including its full content.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/artifacts/{id}/.get.parameters[].description
A unique integer value identifying this artifact.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/artifacts/{id}/.get.responses.200.content.application/json.examples.ArtifactDetailResponse.value.content
```python
def add(a, b):
    return a + b
```

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/artifacts/{id}/.put.description
Update all fields of an artifact (excluding session reference).

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/artifacts/{id}/.put.parameters[].description
A unique integer value identifying this artifact.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/artifacts/{id}/.patch.parameters[].description
A unique integer value identifying this artifact.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/artifacts/{id}/.delete.parameters[].description
A unique integer value identifying this artifact.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/artifacts/{id}/version.get.description
Retrieve all versions for a specific artifact.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/artifacts/{id}/version.get.parameters[].description
A unique integer value identifying this artifact.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/artifacts/{id}/version.get.parameters[].description
Which field to use when ordering the results.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/artifacts/{id}/version.get.parameters[].description
A page number within the paginated result set.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/artifacts/{id}/version.get.responses.200.content.application/json.examples.ArtifactVersionsListResponse.value.results[][].content
def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/artifacts/{id}/version.get.description
Retrieve a specific version of an artifact by version ID.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/artifacts/{id}/version.get.parameters[].description
A unique integer value identifying this artifact.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/artifacts/{id}/version.get.responses.200.content.application/json.examples.ArtifactVersionDetailResponse.value.content
def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/artifacts/{id}/version.post.description
Mark a specific version as the current/active version for an artifact.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/artifacts/{id}/version.post.parameters[].description
A unique integer value identifying this artifact.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/assumed-knowledge/.get.description
Retrieve assumed knowledge levels.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    user_id: The ID of the user to retrieve assumed knowledge for.

Returns:
    Response: The assumed knowledge levels for different categories.

Raises:
    NotFound: If no assumed knowledge exists for the user.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/assumed-knowledge/.post.description
Update assumed knowledge levels.

Args:
    request: The HTTP request containing the updated knowledge levels.
    org: The organization/tenant identifier.
    user_id: The ID of the user to update assumed knowledge for.

Returns:
    Response: The updated assumed knowledge levels.

Raises:
    BadRequest: If the provided data is invalid.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/assumed-knowledge/.post.requestBody.content.application/json.examples.UpdateAssumedKnowledgeRequestExample.summary
Update Assumed Knowledge Request Example

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/assumed-knowledge/.post.responses.200.content.application/json.examples.UpdateAssumedKnowledgeResponseExample.summary
Update Assumed Knowledge Response Example

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/audio-to-text/.post.description
Convert an uploaded audio file to text.

Args:
    request: The HTTP request containing the audio file.
    org: The organization/tenant identifier.
    user_id: The ID of the user uploading the audio.

Returns:
    Response: The transcribed text from the audio file.

Raises:
    BadRequest: If the audio file is invalid or cannot be processed.
    NotFound: If the API key for the tenant is not found.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/audio-to-text/.post.responses.200.content.application/json.examples.AudioToTextResponseExample.value.text
This is the transcribed text from the audio file.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/available-template-men.get.description
This endpoint list available template mentors for a tenant

Returns:

    200 : List of Template Mentors

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/available-template-men.get.responses.200.content.application/json.examples.ListOfAvailableTemplateMentors.value[].description
Upbeat, encouraging tutor helping students understand concepts by explaining ideas and asking questions.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/available-template-men.get.responses.200.content.application/json.examples.ListOfAvailableTemplateMentors.value[].system_prompt
Wrap all responses in MARKDOWN formatted text.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/call-configurations/.get.description
API ViewSet for managing call configurations.

This ViewSet provides endpoints to retrieve, create, and update call configurations
for mentors. Call configurations define how voice calls are handled for a mentor.

Permissions:
    - Accessible only to platform admins.

Endpoints:
    GET /api/org/{org}/mentors/{mentor_pk}/call-configurations/
        - List all call configurations for a specific mentor
        - Returns paginated list of call configurations

    POST /api/org/{org}/mentors/{mentor_pk}/call-configurations/
        - Create a new call configuration for a mentor
        - Requires call configuration data in request body

    PUT /api/org/{org}/mentors/{mentor_pk}/call-configurations/{id}/
        - Update an existing call configuration
        - Requires call configuration data in request body

Query Parameters:
    - mentor: Filter configurations by mentor ID

Returns:
    - CallConfigurationSerializer data

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/call-configurations/.get.parameters[].description
* `realtime` - Realtime
* `inference` - Inference

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/call-configurations/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/call-configurations/.post.description
API ViewSet for managing call configurations.

This ViewSet provides endpoints to retrieve, create, and update call configurations
for mentors. Call configurations define how voice calls are handled for a mentor.

Permissions:
    - Accessible only to platform admins.

Endpoints:
    GET /api/org/{org}/mentors/{mentor_pk}/call-configurations/
        - List all call configurations for a specific mentor
        - Returns paginated list of call configurations

    POST /api/org/{org}/mentors/{mentor_pk}/call-configurations/
        - Create a new call configuration for a mentor
        - Requires call configuration data in request body

    PUT /api/org/{org}/mentors/{mentor_pk}/call-configurations/{id}/
        - Update an existing call configuration
        - Requires call configuration data in request body

Query Parameters:
    - mentor: Filter configurations by mentor ID

Returns:
    - CallConfigurationSerializer data

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/call-configurations/{i.get.description
API ViewSet for managing call configurations.

This ViewSet provides endpoints to retrieve, create, and update call configurations
for mentors. Call configurations define how voice calls are handled for a mentor.

Permissions:
    - Accessible only to platform admins.

Endpoints:
    GET /api/org/{org}/mentors/{mentor_pk}/call-configurations/
        - List all call configurations for a specific mentor
        - Returns paginated list of call configurations

    POST /api/org/{org}/mentors/{mentor_pk}/call-configurations/
        - Create a new call configuration for a mentor
        - Requires call configuration data in request body

    PUT /api/org/{org}/mentors/{mentor_pk}/call-configurations/{id}/
        - Update an existing call configuration
        - Requires call configuration data in request body

Query Parameters:
    - mentor: Filter configurations by mentor ID

Returns:
    - CallConfigurationSerializer data

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/call-configurations/{i.get.parameters[].description
A unique integer value identifying this call configuration.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/call-configurations/{i.put.description
API ViewSet for managing call configurations.

This ViewSet provides endpoints to retrieve, create, and update call configurations
for mentors. Call configurations define how voice calls are handled for a mentor.

Permissions:
    - Accessible only to platform admins.

Endpoints:
    GET /api/org/{org}/mentors/{mentor_pk}/call-configurations/
        - List all call configurations for a specific mentor
        - Returns paginated list of call configurations

    POST /api/org/{org}/mentors/{mentor_pk}/call-configurations/
        - Create a new call configuration for a mentor
        - Requires call configuration data in request body

    PUT /api/org/{org}/mentors/{mentor_pk}/call-configurations/{id}/
        - Update an existing call configuration
        - Requires call configuration data in request body

Query Parameters:
    - mentor: Filter configurations by mentor ID

Returns:
    - CallConfigurationSerializer data

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/call-configurations/{i.put.parameters[].description
A unique integer value identifying this call configuration.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/call-configurations/{i.patch.description
API ViewSet for managing call configurations.

This ViewSet provides endpoints to retrieve, create, and update call configurations
for mentors. Call configurations define how voice calls are handled for a mentor.

Permissions:
    - Accessible only to platform admins.

Endpoints:
    GET /api/org/{org}/mentors/{mentor_pk}/call-configurations/
        - List all call configurations for a specific mentor
        - Returns paginated list of call configurations

    POST /api/org/{org}/mentors/{mentor_pk}/call-configurations/
        - Create a new call configuration for a mentor
        - Requires call configuration data in request body

    PUT /api/org/{org}/mentors/{mentor_pk}/call-configurations/{id}/
        - Update an existing call configuration
        - Requires call configuration data in request body

Query Parameters:
    - mentor: Filter configurations by mentor ID

Returns:
    - CallConfigurationSerializer data

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/call-configurations/{i.patch.parameters[].description
A unique integer value identifying this call configuration.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/category-groups/.get.description
Retrieve a list of Mentor Category Groups.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/category-groups/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/category-groups/.post.description
Create a new Mentor Category Group. Only accessible to Platform Admins.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/category-groups/{id}/.get.description
Mentor Category Groups offer parent grouping for mentor category objects.

The parameter `audience` is deprecated and is currently left behind for backward compatibility.

Permissions:
    GET: Accessible to both Platform Admins and Students
    POST, DELETE, PATCH, PUT: Accessible to only Platform Admins

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/category-groups/{id}/.get.parameters[].description
A unique integer value identifying this mentor category group.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/category-groups/{id}/.put.description
Mentor Category Groups offer parent grouping for mentor category objects.

The parameter `audience` is deprecated and is currently left behind for backward compatibility.

Permissions:
    GET: Accessible to both Platform Admins and Students
    POST, DELETE, PATCH, PUT: Accessible to only Platform Admins

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/category-groups/{id}/.put.parameters[].description
A unique integer value identifying this mentor category group.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/category-groups/{id}/.patch.description
Mentor Category Groups offer parent grouping for mentor category objects.

The parameter `audience` is deprecated and is currently left behind for backward compatibility.

Permissions:
    GET: Accessible to both Platform Admins and Students
    POST, DELETE, PATCH, PUT: Accessible to only Platform Admins

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/category-groups/{id}/.patch.parameters[].description
A unique integer value identifying this mentor category group.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/category-groups/{id}/.delete.description
Mentor Category Groups offer parent grouping for mentor category objects.

The parameter `audience` is deprecated and is currently left behind for backward compatibility.

Permissions:
    GET: Accessible to both Platform Admins and Students
    POST, DELETE, PATCH, PUT: Accessible to only Platform Admins

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/category-groups/{id}/.delete.parameters[].description
A unique integer value identifying this mentor category group.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/chat-messages/{chat_me.get.description
Converts the text content of a chat message into MP3 audio using the mentor's configured TTS provider (openai or google).

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/chat-run-trackers/.get.description
Read-only endpoint for viewing chat run tracking data.

Provides per-request telemetry for chat interactions including timing
breakdowns, LLM provider info, fallback usage, and failure categories.

Results are scoped to the platform (org) from the URL and ordered by
most recent first by default.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/chat-run-trackers/.get.parameters[].description
* `llm_error` - Llm Error
* `moderation_block` - Moderation Block
* `safety_block` - Safety Block
* `privacy_block` - Privacy Block
* `authentication_error` - Authentication Error
* `authorization_error` - Authorization Error
* `payment_error` - Payment Error
* `validation_error` - Validation Error
* `content_filter` - Content Filter
* `input_too_large` - Input Too Large
* `timeout` - Timeout
* `unknown` - Unknown

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/chat-run-trackers/.get.parameters[].description
* `text` - Text
* `multimodal` - Multimodal
* `voice` - Voice

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/chat-run-trackers/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/chat-run-trackers/.get.parameters[].description
A page number within the paginated result set.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/chat-run-trackers/.get.parameters[].description
* `started` - Started
* `completed` - Completed
* `failed` - Failed

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/chat-run-trackers/{id}.get.description
Read-only endpoint for viewing chat run tracking data.

Provides per-request telemetry for chat interactions including timing
breakdowns, LLM provider info, fallback usage, and failure categories.

Results are scoped to the platform (org) from the URL and ordered by
most recent first by default.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/chat-run-trackers/{id}.get.parameters[].description
A unique value identifying this chat run tracker.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/chat/files/upload-url/.post.description
Generate presigned S3 upload URL for chat file

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/clean-vector-results/{.get.description
Retrieve and clean up vector results from a specific session.

This endpoint retrieves the documents last used by the mentor to answer
the most recent query from the user in the specified session, and cleans
them to remove any inappropriate content.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    user_id: The ID of the user making the request.
    session_id: The ID of the session to retrieve vector results from.

Returns:
    Response: The cleaned vector results.

Raises:
    BadRequest: If the API key for the cleaning provider is not found.
    NotFound: If no vector results are found for the session.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/clean-vector-results/{.get.responses.200.content.application/json.examples.VectorResultsResponseExample.value[][].snippet
Machine learning is a subset of artificial intelligence that focuses on developing systems that can learn from data.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/clean-vector-results/{.post.description
Clean up provided vector results.

This endpoint allows users to submit specific vector results for cleaning,
which is useful when there are particular documents that need to be processed.

Args:
    request: The HTTP request containing the vector results to clean.
    org: The organization/tenant identifier.
    user_id: The ID of the user making the request.

Returns:
    Response: The cleaned vector results.

Raises:
    BadRequest: If the API key for the cleaning provider is not found or the provided data is invalid.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/clean-vector-results/{.post.requestBody.content.application/json.examples.CleanVectorResultsRequestExample.value[][].snippet
Machine learning is a subset of artificial intelligence that focuses on developing systems that can learn from data.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/clean-vector-results/{.post.responses.200.content.application/json.examples.CleanVectorResultsResponseExample.value[][].snippet
Machine learning is a subset of artificial intelligence that focuses on developing systems that can learn from data.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/clear-chathistory.delete.description
Endpoint to clear a user's chat history.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation-task-f.get.description
Endpoint to fetch update and delete files associated with course creation tasks.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation-task-f.get.parameters[].description
A page number within the paginated result set.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation-task-f.post.description
Endpoint to fetch update and delete files associated with course creation tasks.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation-task-f.get.description
Endpoint to fetch update and delete files associated with course creation tasks.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation-task-f.get.parameters[].description
A unique integer value identifying this course creation task file.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation-task-f.put.description
Endpoint to fetch update and delete files associated with course creation tasks.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation-task-f.put.parameters[].description
A unique integer value identifying this course creation task file.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation-task-f.patch.description
Endpoint to fetch update and delete files associated with course creation tasks.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation-task-f.patch.parameters[].description
A unique integer value identifying this course creation task file.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation-task-f.delete.description
Endpoint to fetch update and delete files associated with course creation tasks.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation-task-f.delete.parameters[].description
A unique integer value identifying this course creation task file.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation-tasks/.get.description
Create, retrieve and delete course creation tasks

Course creation tasks allow you to schedule the creation of a course on OpenEdx deployment connected to this data manager.

The course is created entirely by an ai model (as specified in your inputs).

The llm decides on the content of the course based on the name, description, target audience and other parameters.
Bigger and newer models tend to outperform smaller once.

Clear and unambiguous parameters are more likely to produce better results.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation-tasks/.get.parameters[].description
A page number within the paginated result set.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation-tasks/.post.description
Create, retrieve and delete course creation tasks

Course creation tasks allow you to schedule the creation of a course on OpenEdx deployment connected to this data manager.

The course is created entirely by an ai model (as specified in your inputs).

The llm decides on the content of the course based on the name, description, target audience and other parameters.
Bigger and newer models tend to outperform smaller once.

Clear and unambiguous parameters are more likely to produce better results.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation-tasks/.get.description
Create, retrieve and delete course creation tasks

Course creation tasks allow you to schedule the creation of a course on OpenEdx deployment connected to this data manager.

The course is created entirely by an ai model (as specified in your inputs).

The llm decides on the content of the course based on the name, description, target audience and other parameters.
Bigger and newer models tend to outperform smaller once.

Clear and unambiguous parameters are more likely to produce better results.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation-tasks/.get.parameters[].description
A unique integer value identifying this course creation task.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation-tasks/.delete.description
Create, retrieve and delete course creation tasks

Course creation tasks allow you to schedule the creation of a course on OpenEdx deployment connected to this data manager.

The course is created entirely by an ai model (as specified in your inputs).

The llm decides on the content of the course based on the name, description, target audience and other parameters.
Bigger and newer models tend to outperform smaller once.

Clear and unambiguous parameters are more likely to produce better results.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation-tasks/.delete.parameters[].description
A unique integer value identifying this course creation task.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation-tasks/.get.description
Cancel a course creation task run.
** Conditions Required **:
The task must be running or pending.
** Response **:
- 200: The course creation task is successfully cancelled.
- 400: The course creation task is not in a running or pending state.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation-tasks/.get.parameters[].description
A unique integer value identifying this course creation task.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation-tasks/.post.description
Create a blank course on EdX and trigger background settings update.

Creates the course on EdX synchronously. If successful, schedules a
background task to generate and apply course settings and images via AI.

Returns immediately after course creation — settings/images are applied
asynchronously.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation-tasks/.post.parameters[].description
A unique integer value identifying this course creation task.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation-tasks/.get.description
Generate a course outline synchronously.

Creates the course outline via LLM and pushes it to EdX.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation-tasks/.get.parameters[].description
A unique integer value identifying this course creation task.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation-tasks/.post.description
Generate a course outline synchronously.

Creates the course outline via LLM and pushes it to EdX.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation-tasks/.post.parameters[].description
A unique integer value identifying this course creation task.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation-tasks/.get.description
Kick start the course creation task.
This endpoint should be called once the files for a course creation task has
been successfully uploaded.

** Conditions Required **:
- The course creation task must be in a pending state or failed state.

** Response **:
- 200: The course creation task is successfully started.
- 400: The course creation task is not in a pending state.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation-tasks/.get.parameters[].description
A unique integer value identifying this course creation task.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/course.get.description
API viewset for managing EdX courses.

This viewset allows platform administrators to retrieve, delete, and
perform various operations on EdX courses that were created through
course creation tasks.

Permissions:
    - Restricted to platform administrators only

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/course.get.parameters[].description
Which field to use when ordering the results.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/course.get.parameters[].description
A page number within the paginated result set.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/course.post.description
API viewset for managing EdX courses.

This viewset allows platform administrators to retrieve, delete, and
perform various operations on EdX courses that were created through
course creation tasks.

Permissions:
    - Restricted to platform administrators only

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/course.get.description
API viewset for managing EdX courses.

This viewset allows platform administrators to retrieve, delete, and
perform various operations on EdX courses that were created through
course creation tasks.

Permissions:
    - Restricted to platform administrators only

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/course.get.parameters[].description
A unique integer value identifying this edx course.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/course.delete.description
API viewset for managing EdX courses.

This viewset allows platform administrators to retrieve, delete, and
perform various operations on EdX courses that were created through
course creation tasks.

Permissions:
    - Restricted to platform administrators only

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/course.delete.parameters[].description
A unique integer value identifying this edx course.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/course.post.description
Create a new xblock under a parent within this course.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/course.post.parameters[].description
A unique integer value identifying this edx course.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/course.post.parameters[].description
A unique integer value identifying this edx course.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/course.get.description
Generate draft content for all units in a course.

This action starts a background task to create draft content
for all units in the course using AI.

Args:
    request: The HTTP request.
    pk: The primary key of the course to generate content for.

Returns:
    Response: A confirmation that the content generation task has been started.

Raises:
    NotFound: If the specified course does not exist.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/course.get.parameters[].description
A unique integer value identifying this edx course.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/course.post.description
Draft content for a single unit synchronously.

Only xblock_id is required. The display_name and unit_type are
fetched from EdX automatically.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/course.post.parameters[].description
A unique integer value identifying this edx course.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/course.get.description
Retrieve the full structure of a course from EdX.

This action returns the complete hierarchical structure of the course,
including all sections, subsections, units, and components.

Use ``?include_content=true`` to include component HTML content (slower).

Args:
    request: The HTTP request.
    pk: The primary key of the course to retrieve.

Returns:
    Response: The full structure of the course.

Raises:
    NotFound: If the specified course does not exist.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/course.get.parameters[].description
A unique integer value identifying this edx course.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/course.get.description
Fetch and report course outline directly from the LMS

Outline includes all sections, subsections, units and components.
This does not include the html content of the components.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/course.get.parameters[].description
A unique integer value identifying this edx course.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/course.post.description
Reorder the children of an xblock within this course.

This is also useful for moving an element from its parent to another.
If you set an xblock as a child of another parent, it is automatically removed from its
previous position and placed in the child position of the current specified parent.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/course.post.parameters[].description
A unique integer value identifying this edx course.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/course.get.description
Fetch a student's completion progress for this course.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/course.get.parameters[].description
A unique integer value identifying this edx course.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/course.get.parameters[].description
Username of the student whose progress to fetch.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/course.get.description
Publish the course structure on EdX synchronously.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/course.get.parameters[].description
A unique integer value identifying this edx course.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/course.post.description
Publish the course structure on EdX synchronously.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/course.post.parameters[].description
A unique integer value identifying this edx course.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/course.post.description
Update an xblock's display name and/or content.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/course.post.parameters[].description
A unique integer value identifying this edx course.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/files/.get.description
Endpoint to fetch update and delete files associated with course creation tasks.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/files/.get.parameters[].description
A page number within the paginated result set.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/files/.post.description
Endpoint to fetch update and delete files associated with course creation tasks.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/files/.get.description
Endpoint to fetch update and delete files associated with course creation tasks.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/files/.get.parameters[].description
A unique integer value identifying this course creation task file.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/files/.put.description
Endpoint to fetch update and delete files associated with course creation tasks.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/files/.put.parameters[].description
A unique integer value identifying this course creation task file.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/files/.patch.description
Endpoint to fetch update and delete files associated with course creation tasks.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/files/.patch.parameters[].description
A unique integer value identifying this course creation task file.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/files/.delete.description
Endpoint to fetch update and delete files associated with course creation tasks.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/files/.delete.parameters[].description
A unique integer value identifying this course creation task file.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/tasks/.get.description
Create, retrieve and delete course creation tasks

Course creation tasks allow you to schedule the creation of a course on OpenEdx deployment connected to this data manager.

The course is created entirely by an ai model (as specified in your inputs).

The llm decides on the content of the course based on the name, description, target audience and other parameters.
Bigger and newer models tend to outperform smaller once.

Clear and unambiguous parameters are more likely to produce better results.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/tasks/.get.parameters[].description
A page number within the paginated result set.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/tasks/.post.description
Create, retrieve and delete course creation tasks

Course creation tasks allow you to schedule the creation of a course on OpenEdx deployment connected to this data manager.

The course is created entirely by an ai model (as specified in your inputs).

The llm decides on the content of the course based on the name, description, target audience and other parameters.
Bigger and newer models tend to outperform smaller once.

Clear and unambiguous parameters are more likely to produce better results.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/tasks/.get.description
Create, retrieve and delete course creation tasks

Course creation tasks allow you to schedule the creation of a course on OpenEdx deployment connected to this data manager.

The course is created entirely by an ai model (as specified in your inputs).

The llm decides on the content of the course based on the name, description, target audience and other parameters.
Bigger and newer models tend to outperform smaller once.

Clear and unambiguous parameters are more likely to produce better results.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/tasks/.get.parameters[].description
A unique integer value identifying this course creation task.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/tasks/.delete.description
Create, retrieve and delete course creation tasks

Course creation tasks allow you to schedule the creation of a course on OpenEdx deployment connected to this data manager.

The course is created entirely by an ai model (as specified in your inputs).

The llm decides on the content of the course based on the name, description, target audience and other parameters.
Bigger and newer models tend to outperform smaller once.

Clear and unambiguous parameters are more likely to produce better results.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/tasks/.delete.parameters[].description
A unique integer value identifying this course creation task.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/tasks/.get.description
Cancel a course creation task run.
** Conditions Required **:
The task must be running or pending.
** Response **:
- 200: The course creation task is successfully cancelled.
- 400: The course creation task is not in a running or pending state.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/tasks/.get.parameters[].description
A unique integer value identifying this course creation task.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/tasks/.post.description
Create a blank course on EdX and trigger background settings update.

Creates the course on EdX synchronously. If successful, schedules a
background task to generate and apply course settings and images via AI.

Returns immediately after course creation — settings/images are applied
asynchronously.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/tasks/.post.parameters[].description
A unique integer value identifying this course creation task.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/tasks/.get.description
Generate a course outline synchronously.

Creates the course outline via LLM and pushes it to EdX.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/tasks/.get.parameters[].description
A unique integer value identifying this course creation task.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/tasks/.post.description
Generate a course outline synchronously.

Creates the course outline via LLM and pushes it to EdX.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/tasks/.post.parameters[].description
A unique integer value identifying this course creation task.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/tasks/.get.description
Kick start the course creation task.
This endpoint should be called once the files for a course creation task has
been successfully uploaded.

** Conditions Required **:
- The course creation task must be in a pending state or failed state.

** Response **:
- 200: The course creation task is successfully started.
- 400: The course creation task is not in a pending state.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/course-creation/tasks/.get.parameters[].description
A unique integer value identifying this course creation task.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/create-mentor-wizard/.post.description
Create a new mentor using the wizard interface.

Args:
    request: The HTTP request containing the mentor data.
    org: The organization/tenant identifier.
    user_id: The ID of the user creating the mentor.

Returns:
    Response: The created mentor.

Raises:
    BadRequest: If the provided data is invalid.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/create-mentor-wizard/.post.requestBody.content.application/json.examples.CreateMentorRequestExample.value.description
A mentor specialized in data science and machine learning concepts.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/create-mentor-wizard/.post.responses.201.content.application/json.examples.CreateMentorResponseExample.value.description
A mentor specialized in data science and machine learning concepts.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/create-mentor-wizard/.put.description
API view for creating a mentor using the wizard interface.

This view allows platform administrators to create new mentors with
basic configuration through a simplified wizard process.

Permissions:
    - Restricted to platform administrators only

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/create-mentor-wizard/.patch.description
API view for creating a mentor using the wizard interface.

This view allows platform administrators to create new mentors with
basic configuration through a simplified wizard process.

Permissions:
    - Restricted to platform administrators only

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/create-mentor-wizard/.delete.description
API view for creating a mentor using the wizard interface.

This view allows platform administrators to create new mentors with
basic configuration through a simplified wizard process.

Permissions:
    - Restricted to platform administrators only

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/custom-instruction/.get.description
Retrieve custom instructions for a specific user.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    user_id: The ID of the user to retrieve custom instructions for.

Returns:
    Response: The custom instructions for the user.

Raises:
    NotFound: If no custom instructions exist for the user.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/custom-instruction/.get.responses.200.content.application/json.examples.CustomInstructionResponseExample.value.content
Always explain concepts in simple terms with examples.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/custom-instruction/.post.description
Create a new custom instruction for a user.

Args:
    request: The HTTP request containing the custom instruction data.
    org: The organization/tenant identifier.
    user_id: The ID of the user to create custom instructions for.

Returns:
    Response: The created custom instruction.

Raises:
    BadRequest: If the provided data is invalid.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/custom-instruction/.post.requestBody.content.application/json.examples.CreateCustomInstructionRequestExample.value.content
Always explain concepts in simple terms with examples.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/custom-instruction/.post.requestBody.content.application/json.examples.CreateCustomInstructionRequestExample.summary
Create Custom Instruction Request Example

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/custom-instruction/.post.responses.201.content.application/json.examples.CreateCustomInstructionResponseExample.value.content
Always explain concepts in simple terms with examples.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/custom-instruction/.post.responses.201.content.application/json.examples.CreateCustomInstructionResponseExample.summary
Create Custom Instruction Response Example

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/custom-instruction/.put.description
Update an existing custom instruction for a user.

Args:
    request: The HTTP request containing the updated custom instruction data.
    org: The organization/tenant identifier.
    user_id: The ID of the user to update custom instructions for.

Returns:
    Response: The updated custom instruction.

Raises:
    BadRequest: If the provided data is invalid.
    NotFound: If no custom instruction exists for the user.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/custom-instruction/.put.requestBody.content.application/json.examples.UpdateCustomInstructionRequestExample.value.content
Always explain concepts in simple terms with examples and analogies.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/custom-instruction/.put.requestBody.content.application/json.examples.UpdateCustomInstructionRequestExample.summary
Update Custom Instruction Request Example

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/custom-instruction/.put.responses.200.content.application/json.examples.UpdateCustomInstructionResponseExample.value.content
Always explain concepts in simple terms with examples and analogies.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/custom-instruction/.put.responses.200.content.application/json.examples.UpdateCustomInstructionResponseExample.summary
Update Custom Instruction Response Example

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/disclaimer-agreements/.get.description
API view for managing disclaimer agreements.

This viewset provides Create Read and Delete operations for disclaimer agreements with different access levels:

Platform Admins:
- Can view all disclaimer agreements for their platform
- Have full access to create (for themselves) and delete agreements for themselves and other users.
- Results are paginated and can be filtered

Students:
- Can only view their own disclaimer agreements
- Limited to agreements where they are the user
- Results are paginated and can be filtered

List endpoint returns paginated results with disclaimer agreement objects:

```
{
    "count": int,
    "next": str,
    "previous": str,
    "results": [
        {
            "id": int,
            "user": str,
            "disclaimer": int,
            "agreed_at": datetime,

        },
        ...
    ]
}
```

Detail endpoints return a single disclaimer agreement object with the same structure

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/disclaimer-agreements/.get.parameters[].description
A page number within the paginated result set.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/disclaimer-agreements/.post.description
API view for managing disclaimer agreements.

This viewset provides Create Read and Delete operations for disclaimer agreements with different access levels:

Platform Admins:
- Can view all disclaimer agreements for their platform
- Have full access to create (for themselves) and delete agreements for themselves and other users.
- Results are paginated and can be filtered

Students:
- Can only view their own disclaimer agreements
- Limited to agreements where they are the user
- Results are paginated and can be filtered

List endpoint returns paginated results with disclaimer agreement objects:

```
{
    "count": int,
    "next": str,
    "previous": str,
    "results": [
        {
            "id": int,
            "user": str,
            "disclaimer": int,
            "agreed_at": datetime,

        },
        ...
    ]
}
```

Detail endpoints return a single disclaimer agreement object with the same structure

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/disclaimer-agreements/.get.description
API view for managing disclaimer agreements.

This viewset provides Create Read and Delete operations for disclaimer agreements with different access levels:

Platform Admins:
- Can view all disclaimer agreements for their platform
- Have full access to create (for themselves) and delete agreements for themselves and other users.
- Results are paginated and can be filtered

Students:
- Can only view their own disclaimer agreements
- Limited to agreements where they are the user
- Results are paginated and can be filtered

List endpoint returns paginated results with disclaimer agreement objects:

```
{
    "count": int,
    "next": str,
    "previous": str,
    "results": [
        {
            "id": int,
            "user": str,
            "disclaimer": int,
            "agreed_at": datetime,

        },
        ...
    ]
}
```

Detail endpoints return a single disclaimer agreement object with the same structure

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/disclaimer-agreements/.get.parameters[].description
A unique integer value identifying this disclaimer agreement.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/disclaimer-agreements/.delete.description
API view for managing disclaimer agreements.

This viewset provides Create Read and Delete operations for disclaimer agreements with different access levels:

Platform Admins:
- Can view all disclaimer agreements for their platform
- Have full access to create (for themselves) and delete agreements for themselves and other users.
- Results are paginated and can be filtered

Students:
- Can only view their own disclaimer agreements
- Limited to agreements where they are the user
- Results are paginated and can be filtered

List endpoint returns paginated results with disclaimer agreement objects:

```
{
    "count": int,
    "next": str,
    "previous": str,
    "results": [
        {
            "id": int,
            "user": str,
            "disclaimer": int,
            "agreed_at": datetime,

        },
        ...
    ]
}
```

Detail endpoints return a single disclaimer agreement object with the same structure

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/disclaimer-agreements/.delete.parameters[].description
A unique integer value identifying this disclaimer agreement.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/disclaimers/.get.description
ViewSet for managing mentor disclaimers.

This viewset provides endpoints for creating and managing mentor disclaimers, which are
statements or information that mentors need to share with students.

Permissions:
    - Platform administrators have full CRUD access
    - Students have read-only access
    - Unauthenticated users have no access

Endpoints:
    - GET /api/orgs/{org}/users/{user_id}/disclaimers/ - List all disclaimers
    - POST /api/orgs/{org}/users/{user_id}/disclaimers/ - Create a new disclaimer
    - GET /api/orgs/{org}/users/{user_id}/disclaimers/{id}/ - Retrieve a specific disclaimer
    - PUT/PATCH /api/orgs/{org}/users/{user_id}/disclaimers/{id}/ - Update a disclaimer
    - POST /api/orgs/{org}/users/{user_id}/disclaimers/{id}/add_mentor/ - Add mentor to disclaimer
    - POST /api/orgs/{org}/users/{user_id}/disclaimers/{id}/remove_mentor/ - Remove mentor from disclaimer

Query Parameters:
    - Supports filtering via DjangoFilterBackend
    - See DisclaimerFilterSet for available filters

Returns:
    List endpoint returns paginated results with disclaimer objects:

    ```
    {
        "count": int,
        "next": str,
        "previous": str,
        "results": [
            {
                "id": int,
                "title": str,
                "content": str,
                "mentor": str,
                "platform": str,
                "created_at": datetime,
                "updated_at": datetime
            },
            ...
        ]
    }
    ```

    Detail endpoints return a single disclaimer object with the same structure

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/disclaimers/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/disclaimers/.get.parameters[].description
A page number within the paginated result set.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/disclaimers/.get.parameters[].description
* `platform` - Platform
* `mentor` - Mentor

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/disclaimers/.post.description
ViewSet for managing mentor disclaimers.

This viewset provides endpoints for creating and managing mentor disclaimers, which are
statements or information that mentors need to share with students.

Permissions:
    - Platform administrators have full CRUD access
    - Students have read-only access
    - Unauthenticated users have no access

Endpoints:
    - GET /api/orgs/{org}/users/{user_id}/disclaimers/ - List all disclaimers
    - POST /api/orgs/{org}/users/{user_id}/disclaimers/ - Create a new disclaimer
    - GET /api/orgs/{org}/users/{user_id}/disclaimers/{id}/ - Retrieve a specific disclaimer
    - PUT/PATCH /api/orgs/{org}/users/{user_id}/disclaimers/{id}/ - Update a disclaimer
    - POST /api/orgs/{org}/users/{user_id}/disclaimers/{id}/add_mentor/ - Add mentor to disclaimer
    - POST /api/orgs/{org}/users/{user_id}/disclaimers/{id}/remove_mentor/ - Remove mentor from disclaimer

Query Parameters:
    - Supports filtering via DjangoFilterBackend
    - See DisclaimerFilterSet for available filters

Returns:
    List endpoint returns paginated results with disclaimer objects:

    ```
    {
        "count": int,
        "next": str,
        "previous": str,
        "results": [
            {
                "id": int,
                "title": str,
                "content": str,
                "mentor": str,
                "platform": str,
                "created_at": datetime,
                "updated_at": datetime
            },
            ...
        ]
    }
    ```

    Detail endpoints return a single disclaimer object with the same structure

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/disclaimers/{id}/.get.description
ViewSet for managing mentor disclaimers.

This viewset provides endpoints for creating and managing mentor disclaimers, which are
statements or information that mentors need to share with students.

Permissions:
    - Platform administrators have full CRUD access
    - Students have read-only access
    - Unauthenticated users have no access

Endpoints:
    - GET /api/orgs/{org}/users/{user_id}/disclaimers/ - List all disclaimers
    - POST /api/orgs/{org}/users/{user_id}/disclaimers/ - Create a new disclaimer
    - GET /api/orgs/{org}/users/{user_id}/disclaimers/{id}/ - Retrieve a specific disclaimer
    - PUT/PATCH /api/orgs/{org}/users/{user_id}/disclaimers/{id}/ - Update a disclaimer
    - POST /api/orgs/{org}/users/{user_id}/disclaimers/{id}/add_mentor/ - Add mentor to disclaimer
    - POST /api/orgs/{org}/users/{user_id}/disclaimers/{id}/remove_mentor/ - Remove mentor from disclaimer

Query Parameters:
    - Supports filtering via DjangoFilterBackend
    - See DisclaimerFilterSet for available filters

Returns:
    List endpoint returns paginated results with disclaimer objects:

    ```
    {
        "count": int,
        "next": str,
        "previous": str,
        "results": [
            {
                "id": int,
                "title": str,
                "content": str,
                "mentor": str,
                "platform": str,
                "created_at": datetime,
                "updated_at": datetime
            },
            ...
        ]
    }
    ```

    Detail endpoints return a single disclaimer object with the same structure

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/disclaimers/{id}/.get.parameters[].description
A unique integer value identifying this disclaimer.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/disclaimers/{id}/.put.description
ViewSet for managing mentor disclaimers.

This viewset provides endpoints for creating and managing mentor disclaimers, which are
statements or information that mentors need to share with students.

Permissions:
    - Platform administrators have full CRUD access
    - Students have read-only access
    - Unauthenticated users have no access

Endpoints:
    - GET /api/orgs/{org}/users/{user_id}/disclaimers/ - List all disclaimers
    - POST /api/orgs/{org}/users/{user_id}/disclaimers/ - Create a new disclaimer
    - GET /api/orgs/{org}/users/{user_id}/disclaimers/{id}/ - Retrieve a specific disclaimer
    - PUT/PATCH /api/orgs/{org}/users/{user_id}/disclaimers/{id}/ - Update a disclaimer
    - POST /api/orgs/{org}/users/{user_id}/disclaimers/{id}/add_mentor/ - Add mentor to disclaimer
    - POST /api/orgs/{org}/users/{user_id}/disclaimers/{id}/remove_mentor/ - Remove mentor from disclaimer

Query Parameters:
    - Supports filtering via DjangoFilterBackend
    - See DisclaimerFilterSet for available filters

Returns:
    List endpoint returns paginated results with disclaimer objects:

    ```
    {
        "count": int,
        "next": str,
        "previous": str,
        "results": [
            {
                "id": int,
                "title": str,
                "content": str,
                "mentor": str,
                "platform": str,
                "created_at": datetime,
                "updated_at": datetime
            },
            ...
        ]
    }
    ```

    Detail endpoints return a single disclaimer object with the same structure

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/disclaimers/{id}/.put.parameters[].description
A unique integer value identifying this disclaimer.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/disclaimers/{id}/.patch.description
ViewSet for managing mentor disclaimers.

This viewset provides endpoints for creating and managing mentor disclaimers, which are
statements or information that mentors need to share with students.

Permissions:
    - Platform administrators have full CRUD access
    - Students have read-only access
    - Unauthenticated users have no access

Endpoints:
    - GET /api/orgs/{org}/users/{user_id}/disclaimers/ - List all disclaimers
    - POST /api/orgs/{org}/users/{user_id}/disclaimers/ - Create a new disclaimer
    - GET /api/orgs/{org}/users/{user_id}/disclaimers/{id}/ - Retrieve a specific disclaimer
    - PUT/PATCH /api/orgs/{org}/users/{user_id}/disclaimers/{id}/ - Update a disclaimer
    - POST /api/orgs/{org}/users/{user_id}/disclaimers/{id}/add_mentor/ - Add mentor to disclaimer
    - POST /api/orgs/{org}/users/{user_id}/disclaimers/{id}/remove_mentor/ - Remove mentor from disclaimer

Query Parameters:
    - Supports filtering via DjangoFilterBackend
    - See DisclaimerFilterSet for available filters

Returns:
    List endpoint returns paginated results with disclaimer objects:

    ```
    {
        "count": int,
        "next": str,
        "previous": str,
        "results": [
            {
                "id": int,
                "title": str,
                "content": str,
                "mentor": str,
                "platform": str,
                "created_at": datetime,
                "updated_at": datetime
            },
            ...
        ]
    }
    ```

    Detail endpoints return a single disclaimer object with the same structure

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/disclaimers/{id}/.patch.parameters[].description
A unique integer value identifying this disclaimer.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/disclaimers/{id}/add-m.post.description
Add a mentor to a disclaimer with `mentor` scope. Only platform admins can perform this action.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/disclaimers/{id}/add-m.post.parameters[].description
A unique integer value identifying this disclaimer.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/disclaimers/{id}/remov.post.description
Remove a mentor from a disclaimer with `mentor` scope. Only platform admins can perform this action. Validates that at least one mentor remains after removal.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/disclaimers/{id}/remov.post.parameters[].description
A unique integer value identifying this disclaimer.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/downloads/tasks/{task_.get.description
Retrieves the chat history for a user if the export task is ready.

This Endpoint to download user chathistory.

Accessible to tenant admins and students.

Returns:

    200: When task is not ready.

    200: chat history object

    400: When data is not valid.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/edx-memory/.get.description
Endpoints to fetch and delete Edx stored Memory information stored for a user and a corresponding edx course they have interracted with.
This information is passed to the corresponding mentor so the mentor has context information
about the course and unit that the user last interracted with.

There can be only one UserEdxMemory instance per student and course_id.

Url Args:
    org (str): The organization's platform key.
    user_id (str): The username  identifier of the individual.

Returns:

    200: A paginated list of UserEdxMemory objects

Examples:

    - List all memories
        GET: /api/ai-mentor/orgs/main/users/johndoe/edx-memory/

        Request:        None
        Response:       {
                            "count": 0,
                            "next": null,
                            "previous": null,
                            "results": [{
                                "student": 1,
                                "course_id": "course-v1:main+CARBON+2024_Fall",
                                "data": {},
                                "date_created": "2024-06-25T15:30:26.257140",
                                "last_modified": "2024-06-25T15:30:26.257140"
                            }]
                        }
    - Get a single UserEdxMemory object
        GET: /api/ai-mentor/orgs/main/users/johndoe/edx-memory/1/

        Request:        None
        Response:       {
                            "student": 1,
                            "course_id": "course-v1:main+CARBON+2024_Fall",
                            "data": {},
                            "date_created": "2024-06-25T15:30:26.257140",
                            "last_modified": "2024-06-25T15:30:26.257140"
                        }

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/edx-memory/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/edx-memory/.get.parameters[].description
A page number within the paginated result set.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/edx-memory/{id}/.get.description
Endpoints to fetch and delete Edx stored Memory information stored for a user and a corresponding edx course they have interracted with.
This information is passed to the corresponding mentor so the mentor has context information
about the course and unit that the user last interracted with.

There can be only one UserEdxMemory instance per student and course_id.

Url Args:
    org (str): The organization's platform key.
    user_id (str): The username  identifier of the individual.

Returns:

    200: A paginated list of UserEdxMemory objects

Examples:

    - List all memories
        GET: /api/ai-mentor/orgs/main/users/johndoe/edx-memory/

        Request:        None
        Response:       {
                            "count": 0,
                            "next": null,
                            "previous": null,
                            "results": [{
                                "student": 1,
                                "course_id": "course-v1:main+CARBON+2024_Fall",
                                "data": {},
                                "date_created": "2024-06-25T15:30:26.257140",
                                "last_modified": "2024-06-25T15:30:26.257140"
                            }]
                        }
    - Get a single UserEdxMemory object
        GET: /api/ai-mentor/orgs/main/users/johndoe/edx-memory/1/

        Request:        None
        Response:       {
                            "student": 1,
                            "course_id": "course-v1:main+CARBON+2024_Fall",
                            "data": {},
                            "date_created": "2024-06-25T15:30:26.257140",
                            "last_modified": "2024-06-25T15:30:26.257140"
                        }

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/edx-memory/{id}/.get.parameters[].description
A unique integer value identifying this user edx memory.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/edx-memory/{id}/.delete.description
Endpoints to fetch and delete Edx stored Memory information stored for a user and a corresponding edx course they have interracted with.
This information is passed to the corresponding mentor so the mentor has context information
about the course and unit that the user last interracted with.

There can be only one UserEdxMemory instance per student and course_id.

Url Args:
    org (str): The organization's platform key.
    user_id (str): The username  identifier of the individual.

Returns:

    200: A paginated list of UserEdxMemory objects

Examples:

    - List all memories
        GET: /api/ai-mentor/orgs/main/users/johndoe/edx-memory/

        Request:        None
        Response:       {
                            "count": 0,
                            "next": null,
                            "previous": null,
                            "results": [{
                                "student": 1,
                                "course_id": "course-v1:main+CARBON+2024_Fall",
                                "data": {},
                                "date_created": "2024-06-25T15:30:26.257140",
                                "last_modified": "2024-06-25T15:30:26.257140"
                            }]
                        }
    - Get a single UserEdxMemory object
        GET: /api/ai-mentor/orgs/main/users/johndoe/edx-memory/1/

        Request:        None
        Response:       {
                            "student": 1,
                            "course_id": "course-v1:main+CARBON+2024_Fall",
                            "data": {},
                            "date_created": "2024-06-25T15:30:26.257140",
                            "last_modified": "2024-06-25T15:30:26.257140"
                        }

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/edx-memory/{id}/.delete.parameters[].description
A unique integer value identifying this user edx memory.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/elevenlabs-voice/.get.description
Retrieve a list of Elevenlabs voices available to a user.

This endpoint returns both custom voices created by the user
and premade voices available to all users.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    user_id: The ID of the user to retrieve voices for.

Returns:
    Response: A list of available Elevenlabs voices.

Raises:
    NotFound: If the specified user does not exist.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/elevenlabs-voice/.post.description
Create a new custom Elevenlabs voice.

This endpoint allows users to upload audio files to create a custom voice
that can be used with the Elevenlabs text-to-speech service.

Note: The audio files' total length should be longer than 1 minute and
the total size should be smaller than 11 MiB.

Args:
    request: The HTTP request containing the voice name and audio files.
    org: The organization/tenant identifier.
    user_id: The ID of the user creating the voice.

Returns:
    Response: The created voice configuration.

Raises:
    BadRequest: If the provided data is invalid, credentials are not found, or there's an API error.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/elevenlabs-voice/.post.responses.400.description
Invalid data, credentials not found, or API error

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/elevenlabs-voice/{voic.delete.description
Delete an existing Elevenlabs voice configuration.

This endpoint removes a custom voice configuration both from the local database
and from the Elevenlabs remote API if applicable.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    user_id: The ID of the user who owns the voice.
    voice_name: The name of the voice to delete.

Returns:
    Response: A confirmation of the deletion.

Raises:
    BadRequest: If the Elevenlabs credentials are not found or there's an API error.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/datasets/.get.description
List datasets belonging to the tenant. Supports server-side filtering by name substring and creator email (matched against the cached `created_by_email` in Langfuse metadata).

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/datasets/.get.parameters[].description
Case-insensitive substring match on the dataset name.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/datasets/.get.parameters[].description
Filter datasets created by this user (exact match).

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/datasets/.post.description
Create a Langfuse dataset under the tenant. The creator's `username` and `user_email` are captured into metadata so future list responses can attribute the row without an extra DB lookup.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/datasets/{.get.responses.403.description
Authenticated, but the resource belongs to another tenant.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/datasets/{.get.description
List items in a dataset. Pass `?include_trace=true` to attach `trace_input` / `trace_output` for items linked to a source trace (one bulk ClickHouse query for the page — no per-row fan-out).

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/datasets/{.get.parameters[].description
When true, populate `trace_input` / `trace_output` from the linked trace for items that have a `source_trace_id`.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/datasets/{.get.parameters[].description
Filter by dataset item status (exact match).

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/datasets/{.post.description
Add items to a dataset. Provide either an `items` array of `{input, expected_output}` objects OR a `trace_ids` array to seed items from existing traces (input/expected are then copied from the trace). Exactly one of the two must be present.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/datasets/{.get.description
Retrieve a single dataset item. `trace_input` / `trace_output` are always populated when the item has a `source_trace_id` (single-row case, no fan-out concern).

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/datasets/{.put.description
Update any subset of `input`, `expected_output`, `metadata`, or `status` on a dataset item. Uses Langfuse's id-based upsert.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/datasets/{.delete.description
Queues the item for deletion in Langfuse. List/get endpoints hide this id immediately, but Langfuse's worker can take up to a few minutes to remove it from its own stores.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/datasets/{.post.description
Bulk-create items from a CSV (multipart `file` field). The CSV must have an `input` column; `expected_output` is optional. Rows with empty `input` are skipped.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/datasets/{.get.description
List runs for a dataset. The response merges Langfuse-persisted runs with in-flight `EvaluationTaskRecord` rows (status `pending` / `in_progress`), deduplicated by `run_name`. `pending_count` reports how many pending entries are in the page so the UI can badge in-flight work.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/datasets/{.get.parameters[].description
Case-insensitive substring match on the run name. Applies to both pending records and Langfuse-persisted runs.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/datasets/{.get.parameters[].description
Filter by the initiator's email. Applies to both pending records and Langfuse-persisted runs.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/datasets/{.post.description
Dispatch a Celery task that runs the chosen mentor against every item in the dataset. Returns immediately (HTTP 202) with the new task record. Poll the list endpoint (or the run-detail endpoint once Langfuse persists the run) to watch the `pending → in_progress → completed` transition.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/datasets/{.post.responses.404.description
Dataset or mentor not found within the tenant.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/datasets/{.get.description
Returns the run header plus every `dataset_run_item` fully expanded with `input`, `expected_output`, `actual_output`, `trace_id`, and per-item `scores`. Also embeds a `pending_judges` array for any in-flight LLM-as-Judge evaluations against this run.

Cost: 1 PG query + 2 ClickHouse queries + 1 score query regardless of run size.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/datasets/{.get.responses.403.description
Authenticated, but the resource belongs to another tenant.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/datasets/{.delete.description
Queues the run for deletion in Langfuse. List/get endpoints hide this run immediately, but Langfuse's worker can take up to a few minutes to remove it from its own stores.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/datasets/{.delete.responses.403.description
Authenticated, but the resource belongs to another tenant.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/datasets/{.get.description
Returns every judge task record (any status) targeting this run. Useful for showing an 'Evaluations' history on a run-detail view, including failed and pending ones.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/datasets/{.post.description
Dispatch a Celery task that runs a separate LLM over every item in the run, scoring the actual output against the input + expected output using the provided criteria. The judge's score lands in Langfuse with `score_name`, and its reasoning is stored in the score's `comment`.

Returns immediately (HTTP 202) with the new task record. The task transitions through `pending → in_progress → completed` (or `failed`); poll the list endpoint or the run-detail endpoint to watch.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/datasets/{.get.description
Download the run as a CSV. Columns: `item_id`, `input`, `expected_output`, `trace_id`, `actual_output`, and one `score_<name>` column per distinct score name in the run.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/datasets/{.get.responses.403.description
Authenticated, but the resource belongs to another tenant.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/judges/.get.description
Returns every judge task record in the tenant, across all datasets and runs. Useful for a tenant-wide 'Evaluations' inbox.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/score-conf.get.description
Score configurations define reusable rubrics (numeric ranges, boolean, or categorical labels). They are optional — scores work without one — but useful for enforcing consistent grading.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/scores/.get.description
List scores (human annotations and LLM-judge results) with optional filters. Pair `dataset_run_id` with a run id to scope to one experiment; pass `trace_id` to scope to a single chat turn or mentor invocation.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/scores/.get.parameters[].description
Restrict to scores attached to this Langfuse run.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/scores/.get.parameters[].description
Restrict to scores on this trace. The same id is exposed as `generation_id` in WebSocket chat frames.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/scores/.get.parameters[].description
Filter by the score creator's email (matched against the `created_by_email` key in score metadata).

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/scores/.post.description
Create a score on a trace or observation. Use this to record human grading of a single chat message (pass the chat frame's `generation_id` as `trace_id`) or to score an experiment-run item (also pass `dataset_run_id` so the score shows up in the run's CSV export).

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/evaluations/scores/{sc.delete.description
Queues the score for deletion in Langfuse. The list endpoint hides this id immediately, but Langfuse's worker can take up to a few minutes to remove it from its own stores.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/free-usage-count.get.description
Retrieve the count of free usage credits available to a user.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    user_id: The ID of the user to check free usage for.

Returns:
    Response: The count of free usage credits available.

Raises:
    NotFound: If the specified user does not exist.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/global-memories/.get.parameters[].description
Search within memory content (case-insensitive)

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/global-memories/.get.parameters[].description
Filter memories created before this ISO datetime

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/global-memories/.get.parameters[].description
Filter memories created after this ISO datetime

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/global-memories/{memor.delete.description
Delete a global memory (user ownership check).

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/google-agents/.get.description
Wires RBAC into a DRF view.

Two responsibilities:

1. When RBAC is enabled, replace the view's `permission_classes` with
   `RbacAuthGate` (the gate the RBAC layer assumes — `IsEdxAuthenticated`
   semantics, plus opt-in acceptance of token-policies PlatformApiKeys for
   views that set `token_policies_enabled = True`).

2. Detect server-to-server (Django auth) callers via `is_service_account`.
   Server-to-server tokens authenticate as Django auth users with no
   relationship to a platform EdxUser. The convention is "we trust this
   caller — bypass RBAC and serve the request."

   Combine it with the RBAC-disabled check at the top of `initial()` so
   the early exit skips all RBAC prep work:

       if not ConfigFlags.rbac_enabled() or self.is_service_account:
           return

   Use `is_service_account` at any other touch points where caller
   identity matters (queryset ownership filters, owner attribution on
   create, serializer context, etc.).

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/google-agents/.get.parameters[].description
A page number within the paginated result set.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/google-agents/.post.description
Sample Request
```
{"name": "my agent", "instruction": "you are a helpful agent",}
```

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/google-agents/{unique_.get.description
Wires RBAC into a DRF view.

Two responsibilities:

1. When RBAC is enabled, replace the view's `permission_classes` with
   `RbacAuthGate` (the gate the RBAC layer assumes — `IsEdxAuthenticated`
   semantics, plus opt-in acceptance of token-policies PlatformApiKeys for
   views that set `token_policies_enabled = True`).

2. Detect server-to-server (Django auth) callers via `is_service_account`.
   Server-to-server tokens authenticate as Django auth users with no
   relationship to a platform EdxUser. The convention is "we trust this
   caller — bypass RBAC and serve the request."

   Combine it with the RBAC-disabled check at the top of `initial()` so
   the early exit skips all RBAC prep work:

       if not ConfigFlags.rbac_enabled() or self.is_service_account:
           return

   Use `is_service_account` at any other touch points where caller
   identity matters (queryset ownership filters, owner attribution on
   create, serializer context, etc.).

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/google-agents/{unique_.delete.description
Wires RBAC into a DRF view.

Two responsibilities:

1. When RBAC is enabled, replace the view's `permission_classes` with
   `RbacAuthGate` (the gate the RBAC layer assumes — `IsEdxAuthenticated`
   semantics, plus opt-in acceptance of token-policies PlatformApiKeys for
   views that set `token_policies_enabled = True`).

2. Detect server-to-server (Django auth) callers via `is_service_account`.
   Server-to-server tokens authenticate as Django auth users with no
   relationship to a platform EdxUser. The convention is "we trust this
   caller — bypass RBAC and serve the request."

   Combine it with the RBAC-disabled check at the top of `initial()` so
   the early exit skips all RBAC prep work:

       if not ConfigFlags.rbac_enabled() or self.is_service_account:
           return

   Use `is_service_account` at any other touch points where caller
   identity matters (queryset ownership filters, owner attribution on
   create, serializer context, etc.).

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mcp-server-connections.get.description
Override list to handle object ownership.

RBAC filtering may remove owned objects if no explicit permissions.
This adds back user-scoped connections owned by the requesting user.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mcp-server-connections.get.parameters[].description
* `none` - None
* `token` - Token
* `oauth2` - Oauth2

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mcp-server-connections.get.parameters[].description
A page number within the paginated result set.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mcp-server-connections.get.parameters[].description
Whether this connection is scoped to a user or shared across a platform.

* `user` - User
* `mentor` - Mentor
* `platform` - Platform

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mcp-server-connections.post.description
ViewSet for MCP server connections.

Tenant administrators can create user- or platform-scoped connections that
encapsulate the authentication configuration for invoking an MCP server.

RBAC Resource Hierarchy:
    MCPServerConnection is a subresource of MCPServer. Resource paths are:
    - Collection: /platforms/{platform_id}/mcpservers/{server_id}/connections/
    - Object: /platforms/{platform_id}/mcpservers/{server_id}/connections/{connection_id}

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mcp-server-connections.get.description
Override retrieve to pass is_owner to action enforcement.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mcp-server-connections.get.parameters[].description
A unique integer value identifying this mcp server connection.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mcp-server-connections.put.description
ViewSet for MCP server connections.

Tenant administrators can create user- or platform-scoped connections that
encapsulate the authentication configuration for invoking an MCP server.

RBAC Resource Hierarchy:
    MCPServerConnection is a subresource of MCPServer. Resource paths are:
    - Collection: /platforms/{platform_id}/mcpservers/{server_id}/connections/
    - Object: /platforms/{platform_id}/mcpservers/{server_id}/connections/{connection_id}

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mcp-server-connections.put.parameters[].description
A unique integer value identifying this mcp server connection.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mcp-server-connections.patch.description
ViewSet for MCP server connections.

Tenant administrators can create user- or platform-scoped connections that
encapsulate the authentication configuration for invoking an MCP server.

RBAC Resource Hierarchy:
    MCPServerConnection is a subresource of MCPServer. Resource paths are:
    - Collection: /platforms/{platform_id}/mcpservers/{server_id}/connections/
    - Object: /platforms/{platform_id}/mcpservers/{server_id}/connections/{connection_id}

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mcp-server-connections.patch.parameters[].description
A unique integer value identifying this mcp server connection.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mcp-server-connections.delete.description
ViewSet for MCP server connections.

Tenant administrators can create user- or platform-scoped connections that
encapsulate the authentication configuration for invoking an MCP server.

RBAC Resource Hierarchy:
    MCPServerConnection is a subresource of MCPServer. Resource paths are:
    - Collection: /platforms/{platform_id}/mcpservers/{server_id}/connections/
    - Object: /platforms/{platform_id}/mcpservers/{server_id}/connections/{connection_id}

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mcp-server-connections.delete.parameters[].description
A unique integer value identifying this mcp server connection.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mcp-servers/.get.description
List MCP servers with mentor-scoped and platform-scoped filtering.

Query Parameters:
    - mentor_unique_id (optional): Filter to mentor-scoped servers for this mentor
    - include_global (optional): Include platform-scoped servers (only with mentor_unique_id)

RBAC Logic:
    - No params: Returns all accessible servers (owned + granted access + platform-scoped)
    - mentor_unique_id only: Returns mentor-scoped servers for that mentor
    - mentor_unique_id + include_global: Returns both mentor-scoped and platform-scoped servers

Note: Queryset filtering is handled in get_queryset() since rbac_manager.enforce_list_data_access
will call get_queryset() internally.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mcp-servers/.get.parameters[].description
Determines the required authentication granularity. 'platform' uses shared platform credentials, 'mentor' requires mentor-level credentials, and 'user' requires each user to authenticate individually.

* `platform` - Platform
* `mentor` - Mentor
* `user` - User

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mcp-servers/.get.parameters[].description
The type of authentication to use for the MCP server.

* `none` - None
* `token` - Token
* `oauth2` - Oauth2

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mcp-servers/.get.parameters[].description
Include platform-scoped resources when filtering by mentor (only relevant with mentor_unique_id)

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mcp-servers/.get.parameters[].description
Optional mentor unique ID to check permissions in mentor context

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mcp-servers/.get.parameters[].description
A page number within the paginated result set.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mcp-servers/.get.parameters[].description
* `sse` - Sse
* `websocket` - Websocket
* `streamable_http` - Streamable Http

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mcp-servers/.post.description
Create a new MCP server with RBAC validation.

If mentor_unique_id is in request data, validates mentor-scoped creation permissions.
Otherwise, validates platform-scoped creation permissions.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mcp-servers/{id}/.get.description
Retrieve a single MCP server with mentor-aware RBAC validation.

Validates permissions based on whether the server is mentor-scoped or platform-scoped.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mcp-servers/{id}/.get.parameters[].description
A unique integer value identifying this mcp server.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mcp-servers/{id}/.put.description
Update an MCP server with mentor-aware RBAC validation.

Validates permissions based on whether the server is mentor-scoped or platform-scoped.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mcp-servers/{id}/.put.parameters[].description
A unique integer value identifying this mcp server.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mcp-servers/{id}/.patch.description
Partially update an MCP server with mentor-aware RBAC validation.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mcp-servers/{id}/.patch.parameters[].description
A unique integer value identifying this mcp server.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mcp-servers/{id}/.delete.description
Delete an MCP server with mentor-aware RBAC validation.

Validates permissions based on whether the server is mentor-scoped or platform-scoped.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mcp-servers/{id}/.delete.parameters[].description
A unique integer value identifying this mcp server.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mcp-servers/oauth-find.post.description
Check that a given mcp server (where the user specifies oauth authentication) either has pre-configured oauth credentials
or support Dynamic Client Registration.

This method:
1. First checks if the MCP server already has a configured OAuth service
2. If not, attempts to discover and register an OAuth service using Dynamic Client Registration
3. Returns the OAuth service information if found or registered

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/memsearch-status/.get.description
GET /orgs/{org}/users/{user_id}/memsearch-status/

Returns whether memsearch is enabled for the tenant.
Accessible by students and admins.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentor-feedback/{feedb.get.description
Retrieve details of a specific user chat feedback entry.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    feedback_id: The ID of the feedback entry to retrieve.

Returns:
    Response: The feedback entry details.

Raises:
    NotFound: If the specified feedback entry does not exist.
    Forbidden: If the user doesn't have permission to access this feedback.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentor-feedback/{feedb.get.responses.200.content.application/json.examples.UserChatFeedbackExample.value.ai_response
Marc H. Supcoff is an Adjunct Professor of Law

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentor-feedback/{feedb.put.description
Update an existing user chat feedback entry.

Args:
    request: The HTTP request containing the updated feedback data.
    org: The organization/tenant identifier.
    feedback_id: The ID of the feedback entry to update.

Returns:
    Response: The updated feedback entry.

Raises:
    NotFound: If the specified feedback entry does not exist.
    Forbidden: If the user doesn't have permission to update this feedback.
    BadRequest: If the provided data is invalid or the mentor does not exist.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentor-feedback/{feedb.put.requestBody.content.application/json.examples.UpdateFeedbackRequestExample.value.ai_response
Marc H. Supcoff is an Adjunct Professor of Law

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentor-feedback/{feedb.put.responses.200.content.application/json.examples.UpdateFeedbackResponseExample.value.ai_response
Marc H. Supcoff is an Adjunct Professor of Law

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentor-feedback/create.post.description
Create a new user chat feedback entry.

Args:
    request: The HTTP request containing the feedback data.
    org: The organization/tenant identifier.

Returns:
    Response: The created feedback entry.

Raises:
    BadRequest: If the provided data is invalid or the mentor does not exist.
    Forbidden: If the user doesn't have permission to create this feedback.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentor-feedback/create.post.requestBody.content.application/json.examples.CreateFeedbackRequestExample.value.ai_response
Marc H. Supcoff is an Adjunct Professor of Law

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentor-feedback/create.post.responses.201.content.application/json.examples.CreateFeedbackResponseExample.value.ai_response
Marc H. Supcoff is an Adjunct Professor of Law

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentor-llms/.get.responses.200.content.application/json.examples.LLMResponse.value[][].overview
Overview

Gemini 1.5 delivers dramatically enhanced performance with a more efficient architecture. The first model we’ve released for early testing, Gemini 1.5 Pro, introduces a breakthrough experimental feature in long-context understanding.

The chat-bison model is a large language model that excels at language understanding, language generation and conversations. This chat model is fine-tuned to conduct natural multi-turn conversations. The PaLM 2 Chat Bison is ideal for text tasks that require back-and-forth interactions. For text tasks that can be completed with one API response (without the need for continuous conversation), use the PaLM 2 Text Bison.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentor-memories/.get.description
List all mentor-specific memories for a user.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentor-memories/.get.parameters[].description
Filter memories created before this ISO date

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentor-memories/.get.parameters[].description
Filter memories created after this ISO date

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentor-tools/.get.description
Retrieve the list of available mentor tools.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentor-with-settings/.post.description
View to create a mentor from a template with settings.

Accessible to tenant admins only.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentor-with-settings/.put.description
View to create a mentor from a template with settings.

Accessible to tenant admins only.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentor-with-settings/.patch.description
View to create a mentor from a template with settings.

Accessible to tenant admins only.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentor-with-settings/.delete.description
View to create a mentor from a template with settings.

Accessible to tenant admins only.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentor/audience/.get.description
Retrieve the list of mentor audiences.

Returns:
    - 200: List of mentor audiences.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentor/audience/.post.description
Create a new mentor audience.

Accessible to tenant admins only.

Returns:
    - 201: Created mentor audience.
    - 401: Unauthorized.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentor/audience/.post.responses.401.description
Unauthorized - Only tenant admins can create mentor audiences.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentor/audience/.delete.description
Delete a mentor audience.

Accessible to tenant admins only.

Returns:
    - 204: No content.
    - 400: Bad request if audience name is missing.
    - 404: Not found if audience does not exist.
    - 401: Unauthorized.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentor/audience/.delete.responses.204.description
No Content - Mentor audience deleted successfully.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentor/audience/.delete.responses.401.description
Unauthorized - Only tenant admins can delete mentor audiences.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentor/categories/.get.description
Retrieve a list of mentor categories.

Returns:
    200: A list of mentor categories.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentor/categories/.post.description
Create a new mentor category.

Accessible only to tenant admins.

Returns:
    200: Details of the created mentor category.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentor/categories/.delete.description
Delete a mentor category.

Accessible only to tenant admins.

Returns:
    204: "No content" when Delete succeeded.
    400: Bad request data received

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentor/seed/.get.description
Seed initial mentors in a tenant.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    user_id: The ID of the user initiating the seeding.

Returns:
    Response: A success message with details about the seeded mentors.

Raises:
    BadRequest: If the seeding process fails.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentor/seed/.get.responses.200.content.application/json.examples.SeedMentorsResponseExample.value.detail
Successfully seeded 5 mentors in the tenant.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentor/seed/.post.description
API view for seeding mentors in a tenant.

This view allows platform administrators to seed initial mentors
in a tenant from predefined templates.

Permissions:
    - Restricted to platform administrators only

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentor/seed/.put.description
API view for seeding mentors in a tenant.

This view allows platform administrators to seed initial mentors
in a tenant from predefined templates.

Permissions:
    - Restricted to platform administrators only

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentor/seed/.patch.description
API view for seeding mentors in a tenant.

This view allows platform administrators to seed initial mentors
in a tenant from predefined templates.

Permissions:
    - Restricted to platform administrators only

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentor/seed/.delete.description
API view for seeding mentors in a tenant.

This view allows platform administrators to seed initial mentors
in a tenant from predefined templates.

Permissions:
    - Restricted to platform administrators only

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor_id}/me.get.description
List mentor-specific memories grouped by category.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor_id}/me.get.parameters[].description
Filter by user email (ignored when my_memory=true)

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor_id}/me.get.parameters[].description
Filter memories created before this ISO date

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor_id}/me.get.parameters[].description
If true, returns only the authenticated user's memories (skips RBAC and user_id filter)

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor_id}/me.get.parameters[].description
Filter memories created after this ISO date

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor_id}/me.get.parameters[].description
Filter by user_id (ignored when my_memory=true)

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor_id}/me.get.description
List mentor-specific memories with pagination.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor_id}/me.get.parameters[].description
Filter by user email (ignored when my_memory=true)

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor_id}/me.get.parameters[].description
Filter memories created before this ISO date

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor_id}/me.get.parameters[].description
If true, returns only the authenticated user's memories (skips RBAC and user_id filter)

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor_id}/me.get.parameters[].description
Filter memories created after this ISO date

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor_id}/me.get.parameters[].description
Filter by user_id (ignored when my_memory=true)

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor_id}/me.patch.description
Update a mentor-specific memory (RBAC ownership-aware).

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor_id}/me.delete.description
Delete a mentor-specific memory (RBAC ownership-aware).

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/.get.description
Retrieve details of a specific mentor by slug or name.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/.get.responses.200.content.application/json.examples.ExampleResponse.value.description
Upbeat, encouraging tutor helping students understand concepts by explaining ideas and asking questions.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/.get.responses.200.content.application/json.examples.ExampleResponse.value.system_prompt
Wrap all responses in MARKDOWN formatted text.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/.get.responses.200.content.application/json.examples.ExampleResponse.value.moderation_system_prompt
You are a moderator tasked with identifying whether a prompt from a user is appropriate or inappropriate. 

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/.get.responses.200.content.application/json.examples.ExampleResponse.value.safety_system_prompt
You are a moderator tasked with identifying whether a message from an ai model to a user is is appropriate or inappropriate. If the message is immoral or contains abusive words, insults, damaging content, and law breaking acts, etc it should be deemed inappropriate. Otherwise it is deemed appropriate.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/.get.responses.200.content.application/json.examples.ExampleResponse.value.safety_response
Sorry, the AI model generated an inappropriate response. Kindly refine your prompt or try again with a different prompt.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/avail.get.description
Retrieve tools available for a particular mentor. The 'is_allowed' field indicates whether the tool is compatible with the mentor's current LLM configuration.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/avail.get.parameters[].description
Which field to use when ordering the results.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/creat.post.description
Generate IBL Call Pro authentication parameters for audio calls.

This endpoint creates the necessary authentication tokens and parameters
for connecting to a IBL Call Pro room for audio communication with a mentor.

Args:
    request: The HTTP request object containing the required parameters.
    org: The organization/tenant identifier.
    user_id: The ID of the user requesting authentication.

Returns:
    Response: IBL Call Pro authentication parameters including URL, room name,
             participant name, and authentication token.

Raises:
    ValidationError: If the request parameters are invalid.
    BadRequest: If the IBL Call Pro credentials are not properly configured.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/creat.post.responses.400.description
Invalid request parameters or improperly configured IBL Call Pro credentials

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/curre.get.description
Retrieve memory components for a specific mentor.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    user_id: The ID of the user making the request.
    mentor: The identifier of the mentor to retrieve memory for.

Returns:
    Response: The memory components for the mentor.

Raises:
    NotFound: If the specified mentor or memory does not exist.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/curre.put.description
Update memory components for a specific mentor.

Args:
    request: The HTTP request containing the updated memory data.
    org: The organization/tenant identifier.
    user_id: The ID of the user making the request.
    mentor: The identifier of the mentor to update memory for.

Returns:
    Response: The updated memory components for the mentor.

Raises:
    BadRequest: If the provided data is invalid.
    NotFound: If the specified mentor does not exist.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/curre.put.responses.200.content.application/json.examples.UpdateMemoryResponseExample.value.questions[].text
What are the main types of machine learning?

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/custo.get.description
Retrieve the current custom voice settings for a mentor.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    user_id: The ID of the user who owns the mentor link.
    mentor: The unique identifier of the mentor.

Returns:
    Response: The current custom voice settings.

Raises:
    NotFound: If the specified mentor or student does not exist.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/custo.post.description
Set a custom voice for a mentor.

This endpoint allows setting a custom voice for a specific mentor,
either using the default voice provider or Elevenlabs.

Args:
    request: The HTTP request containing the voice provider and name.
    org: The organization/tenant identifier.
    user_id: The ID of the user who owns the mentor link.
    mentor: The unique identifier of the mentor.

Returns:
    Response: The updated custom voice settings.

Raises:
    BadRequest: If the provided data is invalid or the voice does not exist.
    NotFound: If the mentor or student does not exist.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/custo.post.description
Generate audio from text using a mentor's custom voice.

This endpoint converts the provided text to speech using the
custom voice configured for the specified mentor.

Args:
    request: The HTTP request containing the text to convert.
    org: The organization/tenant identifier.
    user_id: The ID of the user who owns the mentor link.
    mentor: The unique identifier of the mentor.

Returns:
    Response: An MP3 audio file of the synthesized speech.

Raises:
    BadRequest: If the text is empty, credentials are not found, or custom voice is not set.
    NotFound: If the mentor or student does not exist.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/custo.post.responses.400.description
Invalid data, credentials not found, or custom voice not set

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/edit-.put.description
Update scenarios for a specific mentor.

Args:
    request: The HTTP request containing the updated scenarios.
    org: The organization/tenant identifier.
    user_id: The ID of the user making the request.
    mentor: The identifier of the mentor to update scenarios for.

Returns:
    Response: The updated scenarios for the mentor.

Raises:
    BadRequest: If the provided data is invalid.
    NotFound: If the specified mentor does not exist.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/fork/.post.description
Fork (clone) an existing mentor.

Args:
    request: The HTTP request containing the fork parameters.
    org: The organization/tenant identifier.
    mentor: The identifier of the mentor to fork.
    user_id: The ID of the user initiating the fork.

Returns:
    Response: The newly created forked mentor.

Raises:
    BadRequest: If the provided data is invalid or the fork operation fails.
    NotFound: If the specified mentor does not exist.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/fork/.post.responses.200.content.application/json.examples.ForkMentorResponseExample.value.description
A mentor specialized in data science and machine learning concepts.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/fork/.put.description
API view for forking (cloning) a mentor.

This view allows users to create a copy of an existing mentor
with its settings and configurations.

Permissions:
    - Restricted to tenant admins and the student themselves

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/fork/.patch.description
API view for forking (cloning) a mentor.

This view allows users to create a copy of an existing mentor
with its settings and configurations.

Permissions:
    - Restricted to tenant admins and the student themselves

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/fork/.delete.description
API view for forking (cloning) a mentor.

This view allows users to create a copy of an existing mentor
with its settings and configurations.

Permissions:
    - Restricted to tenant admins and the student themselves

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/histo.get.description
Retrieve memory history entries for a specific mentor and user.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    user_id: The ID of the user to retrieve memory history for.
    mentor: The identifier of the mentor to retrieve memory history for.

Returns:
    Response: The memory history entries for the mentor and user.

Raises:
    NotFound: If the specified mentor or memory history does not exist.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/histo.get.responses.200.content.application/json.examples.MemoryHistoryResponseExample.value[].data[].content
Learner believes that financial management is only relevant for large corporations and not for personal finance.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/histo.get.responses.200.content.application/json.examples.MemoryHistoryResponseExample.value[].data[].content
Learner lacks knowledge of advanced financial analysis techniques such as ratio analysis and cash flow forecasting.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/histo.get.responses.200.content.application/json.examples.MemoryHistoryResponseExample.value[].data[].content
Learner requests clarification on the difference between fixed and variable costs.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/memor.get.description
Retrieve memory settings for a specific mentor.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    user_id: The ID of the user making the request.
    mentor: The identifier of the mentor to retrieve settings for.

Returns:
    Response: The memory settings for the mentor.

Raises:
    NotFound: If the specified mentor or settings do not exist.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/memor.post.description
Endpoint for mentor memory item settings.

Accessible to platform admins and superusers.

Returns:

    200: Change mentor memory component item.

    400: When request is not valid.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/mento.get.description
Retrieve evaluation criteria for a specific mentor.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    user_id: The ID of the user making the request.
    mentor: The identifier of the mentor to retrieve evaluations for.

Returns:
    Response: The evaluation criteria for the mentor.

Raises:
    NotFound: If the specified mentor or evaluations do not exist.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/mento.get.responses.200.content.application/json.examples.MentorEvaluationsResponseExample.value[].questions[].content
how to explain a computer to a 5 year old?

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/mento.get.responses.200.content.application/json.examples.MentorEvaluationsResponseExample.value[].evaluation_prompt
Please evaluate the following answer to the question: {{question}}.

 The sample answer to the question is {{sample_answer}} 

 The answer you are evaluating is {{mentor_answer}}. 

 Give me a rating as an integer between 0 to 100, only say the rating and nothing else.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/mento.post.description
Create or update evaluation criteria for a specific mentor.

Args:
    request: The HTTP request containing the evaluation data.
    org: The organization/tenant identifier.
    user_id: The ID of the user making the request.
    mentor: The identifier of the mentor to create/update evaluations for.

Returns:
    Response: The created or updated evaluation criteria.

Raises:
    BadRequest: If the provided data is invalid or the mentor does not exist.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/mento.post.requestBody.content.application/json.examples.CreateEvaluationRequestExample.value.questions[].content
how to explain a computer to a 5 year old?

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/mento.post.responses.200.content.application/json.examples.EvaluationResponseExample.value.questions[].content
how to explain a computer to a 5 year old?

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/mento.post.responses.200.content.application/json.examples.EvaluationResponseExample.value.evaluation_prompt
Please evaluate the following answer to the question: {{question}}.

 The sample answer to the question is {{sample_answer}} 

 The answer you are evaluating is {{mentor_answer}}. 

 Give me a rating as an integer between 0 to 100, only say the rating and nothing else.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/mento.post.description
Run an evaluation for a specific mentor.

Args:
    request: The HTTP request containing the evaluation ID.
    org: The organization/tenant identifier.
    user_id: The ID of the user making the request.
    mentor: The identifier of the mentor to evaluate.

Returns:
    Response: The ID of the generated evaluation report.

Raises:
    BadRequest: If the evaluation ID is invalid or the mentor does not match.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/mento.post.responses.400.description
Invalid evaluation ID or mentor mismatch

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/mento.post.description
Endpoint to set user settings for a mentor.


POST https://base.manager.iblai.app/api/ai-mentor/orgs/your-org/users/your-user/mentors/unique-id/mentor-user-settings/

Sample request
```
{"reference_saved_memories": true}
```

Sample response
```
{"reference_saved_memories": true}
```

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/mento.put.description
Mixin to set the auditlog actor context for DRF views.

For Django auth.User (admin users): Uses auditlog's native actor FK.
For edX users (AuthStudent): Sets edx_actor FK on DMAuditLogEntry.

IMPORTANT: This mixin only works for views that DO NOT override the
HTTP/action methods (post, put, patch, delete, create, update, partial_update,
destroy). For views that define their own methods, use the @with_auditlog_actor
decorator on those methods instead.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/mento.patch.description
Mixin to set the auditlog actor context for DRF views.

For Django auth.User (admin users): Uses auditlog's native actor FK.
For edX users (AuthStudent): Sets edx_actor FK on DMAuditLogEntry.

IMPORTANT: This mixin only works for views that DO NOT override the
HTTP/action methods (post, put, patch, delete, create, update, partial_update,
destroy). For views that define their own methods, use the @with_auditlog_actor
decorator on those methods instead.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/mento.delete.description
Mixin to set the auditlog actor context for DRF views.

For Django auth.User (admin users): Uses auditlog's native actor FK.
For edX users (AuthStudent): Sets edx_actor FK on DMAuditLogEntry.

IMPORTANT: This mixin only works for views that DO NOT override the
HTTP/action methods (post, put, patch, delete, create, update, partial_update,
destroy). For views that define their own methods, use the @with_auditlog_actor
decorator on those methods instead.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/publi.get.description
Retrieve public mentor settings.

Args:
    request: HTTP request instance.
    user_id: The ID of the user requesting settings.
    mentor: The mentor identifier (name, slug, or unique_id).
    org: The organization key.

Returns:
    Response containing the mentor settings or an error message.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/publi.get.description
Return True if the token is valid and link is enabled, else False

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/repor.get.description
Retrieve a specific evaluation report.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    user_id: The ID of the user making the request.
    mentor: The identifier of the mentor that was evaluated.
    report_id: The ID of the evaluation report to retrieve.

Returns:
    Response: The detailed evaluation report.

Raises:
    BadRequest: If the report does not exist, does not match the mentor, or is still being generated.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/repor.get.responses.200.content.application/json.examples.EvaluationReportResponseExample.value.conversation_ratings[].full_conversation_text
Question: Question: how to explain a computer to a 5 year old?

Answer: To explain a computer to a 5 year old, I would say it's like a magic box that can do many things when you click or tap on different things to see how it works.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/repor.get.responses.200.content.application/json.examples.EvaluationReportResponseExample.value.conversation_ratings[].full_conversation_text
Question: Question: how to learn linux well?

Answer: To learn Linux well, you should start with the basics and practice regularly.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/repor.get.responses.400.description
Report not found or still being generated

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/scena.get.description
Retrieve available scenarios for a specific mentor.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    user_id: The ID of the user making the request.
    mentor: The identifier of the mentor to retrieve scenarios for.

Returns:
    Response: The available scenarios for the mentor.

Raises:
    NotFound: If the specified mentor or scenarios do not exist.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/setti.get.description
Fetch the settings of a mentor within an organization. Only accessible to tenant admins.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/setti.post.description
API view to retrieve and update mentor settings.

Permissions:
    - Only accessible to tenant admins.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/setti.put.description
Update various mentor settings including system prompts, tool permissions, and UI configurations.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/setti.patch.description
API view to retrieve and update mentor settings.

Permissions:
    - Only accessible to tenant admins.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/setti.delete.description
API view to retrieve and update mentor settings.

Permissions:
    - Only accessible to tenant admins.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/shara.get.description
Enpoints to manage mentor shareable links

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/shara.post.description
Enpoints to manage mentor shareable links

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/shara.put.description
Enpoints to manage mentor shareable links

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/shara.delete.description
Enpoints to manage mentor shareable links

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/space.get.description
Retrieve spaced repetition question statistics.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    user_id: The ID of the user to retrieve statistics for.
    mentor: The unique identifier of the mentor.

Returns:
    Response: Statistics about the user's performance on spaced repetition questions.

Raises:
    NotFound: If the mentor or student does not exist.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/space.get.description
Retrieve a list of learning paths associated with a specific mentor and student.

This endpoint uses the memory component to establish the learning context for a student
under the guidance of a mentor. It verifies that the provided organization identifier matches
the mentor's platform key, and then retrieves learning path tags associated with the student's
question cards. Each tag is annotated with the total number of question cards and the count of
cards with successful repetitions (i.e., correct answers). The learning paths are ordered by the
number of correct answers and limited to the top five entries.

Args:
    request: The HTTP request containing the necessary context.
    org (str): The organization identifier/platform key.
    user_id (str): The username of the student.
    mentor (str): The unique identifier of the mentor.
    *args: Additional positional arguments.
    **kwargs: Additional keyword arguments.

Returns:
    Resp200onse: memory component detail infomrmation

Raises:
    NotFound: If the memory component for the specified mentor and student cannot be found,
              or if the organization identifier does not match the mentor's platform key.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/space.put.description
Set a specific learning path for spaced repetition.

Args:
    request: The HTTP request containing the learning path.
    org: The organization/tenant identifier.
    user_id: The ID of the user to set the learning path for.
    mentor: The unique identifier of the mentor.

Returns:
    Response: The set learning path.

Raises:
    BadRequest: If the provided data is invalid.
    NotFound: If the learning path, mentor, or student does not exist.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/space.put.responses.404.description
Learning path, mentor, or student not found

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/star/.get.description
Endpoint for getting the star status of a mentor.

Accessible to students and admins.


Returns:

    200: Star status.

    400: When request is not valid.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/star/.post.description
Endpoint for starring a mentor.

Accessible to students and admins.


Returns:

    200: Star status.

    400: When request is not valid.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/summa.get.description
GET `/api/orgs/<platform_key>/users/<username>/mentors/<mentor_unique_id>/summaries/<summary_type>/`

Endpoint to get mentor summary. The summary type can be `user` or `general`.

Sample response:
```
{"rating": 3.9, "summary": "The mentor had a good chat."}
```

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/{mentor}/unsta.post.description
Remove a mentor from a user's starred list.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    user_id: The ID of the user unstarring the mentor.
    mentor: The identifier of the mentor to unstar.

Returns:
    Response: The updated star status of the mentor.

Raises:
    NotFound: If the specified mentor or student does not exist.
    BadRequest: If the request is invalid.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/audit-logs/.get.description
Retrieve audit log entries for mentor-related models (Mentor, MentorSettings) within a specific organization. Mentor owners can access audit logs for their own mentors when filtering by mentor. Supports filtering by mentor, action type, actor, and date range.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/audit-logs/.get.parameters[].description
Filter by action type: 0=create, 1=update, 2=delete

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/audit-logs/.get.parameters[].description
Inclusive lower bound on timestamp (ISO8601 date, e.g., 2024-01-01)

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/audit-logs/.get.parameters[].description
The initial index from which to return the results.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/mentors/audit-logs/.get.parameters[].description
Inclusive upper bound on timestamp (ISO8601 date, e.g., 2024-12-31)

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/metadata.get.description
Retrieve metadata for a mentor.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    user_id: The ID of the user making the request.

Returns:
    Response: The mentor metadata.

Raises:
    NotFound: If no metadata exists for the specified mentor.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/moderation-logs/.get.description
Endpoint to view and delete Moderation Logs for a tenant.

These can be filtered by username, platform_key and  mentor id


A search query can be conducted to search through the prompts and reason for the moderation catch event.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/moderation-logs/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/moderation-logs/.get.parameters[].description
A page number within the paginated result set.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/moderation-logs/.get.parameters[].description
* `Safety System` - Safety System
* `Moderation System` - Moderation System
* `Privacy System` - Privacy System

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/moderation-logs/{id}/.get.description
Endpoint to view and delete Moderation Logs for a tenant.

These can be filtered by username, platform_key and  mentor id


A search query can be conducted to search through the prompts and reason for the moderation catch event.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/moderation-logs/{id}/.get.parameters[].description
A unique integer value identifying this moderation log.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/moderation-logs/{id}/.delete.description
Endpoint to view and delete Moderation Logs for a tenant.

These can be filtered by username, platform_key and  mentor id


A search query can be conducted to search through the prompts and reason for the moderation catch event.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/moderation-logs/{id}/.delete.parameters[].description
A unique integer value identifying this moderation log.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/periodic-agent-logs/.get.description
Endpoint to view logs for periodic agent runs.

These logs contain the full mentor output for each run for debugging.
Logs are ordered from newest to oldest. However this can be changed.

You can also filter logs for a PeriodicAgent by passing the `periodic_agent` query parameter in the URL.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/periodic-agent-logs/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/periodic-agent-logs/.get.parameters[].description
A page number within the paginated result set.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/periodic-agent-logs/.get.parameters[].description
* `success` - Success
* `error` - Error
* `running` - Running

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/periodic-agent-logs/{i.get.description
Endpoint to view logs for periodic agent runs.

These logs contain the full mentor output for each run for debugging.
Logs are ordered from newest to oldest. However this can be changed.

You can also filter logs for a PeriodicAgent by passing the `periodic_agent` query parameter in the URL.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/periodic-agent-logs/{i.get.parameters[].description
A unique integer value identifying this periodic agent log.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/periodic-agents/.get.description
Endpoint to create and view, update and delete periodic agents.

Periodic agents are schedulers issued for mentors. These are configured with input prompt (if any)
as well as a cron schedule to trigger the periodic agent.

Access to these are restricted to platform admins and tenant administrators

Session information for running the periodic agent will be generated with the credentials of the
user (platform administrator) who created the agent.

A Periodic Agent is allowed to have a `callback_url` and `callback_secret`.
When a `callback_url` is set for a Periodic Agent, a post request with data entries containing the log and timestamp
of the run will be made to the callback_url provided.
Here is the payload structure:
        ```
        {
            "timestamp": "timestamp when the run completed",
            "status": "status of the periodic agent",
            "prompt": "input prompt to agent,
            "agent_output": "...final response of agent",
            "log": "... full agent run log",
            "log_id": periodic agent log id.,
        }
        ```
The payload is encrypted using the `callback_secret` provided.

You can validate the payload using the X-Hub-Signature-256 signature header for request data.
This is a Sha256 encoded HMAC hex digest of the payload body.

```python
import hmac
import haslib

def validate_payload(request: HttpRequest, callback_secret: str):
    # Get the X-Hub-Signature-256 header from the request
    received_signature = request.META.get("HTTP_X_HUB_SIGNATURE_256", "")

    if not received_signature.startswith("sha256="):
        # Invalid signature format
        return False

    received_signature = received_signature[len("sha256=") :]

    try:
        # Get the raw request body
        payload = request.body

        # Compute the expected signature using the app_secret
        expected_signature = hmac.new(
            callback_secret.encode(), payload, hashlib.sha256
        ).hexdigest()

        if hmac.compare_digest(received_signature, expected_signature):
            # Signatures match, the payload is genuine
            return True
        else:
            # Signatures don't match
            return False
    except Exception as e:
        # Handle any errors that may occur during validation
        return False

```

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/periodic-agents/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/periodic-agents/.get.parameters[].description
A page number within the paginated result set.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/periodic-agents/.get.parameters[].description
The status that the previous agent must be in before this agent gets scheduled.

* `success` - Success
* `error` - Error
* `running` - Running
* `pending` - Pending

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/periodic-agents/.get.parameters[].description
* `success` - Success
* `error` - Error
* `running` - Running
* `pending` - Pending

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/periodic-agents/.post.description
Endpoint to create and view, update and delete periodic agents.

Periodic agents are schedulers issued for mentors. These are configured with input prompt (if any)
as well as a cron schedule to trigger the periodic agent.

Access to these are restricted to platform admins and tenant administrators

Session information for running the periodic agent will be generated with the credentials of the
user (platform administrator) who created the agent.

A Periodic Agent is allowed to have a `callback_url` and `callback_secret`.
When a `callback_url` is set for a Periodic Agent, a post request with data entries containing the log and timestamp
of the run will be made to the callback_url provided.
Here is the payload structure:
        ```
        {
            "timestamp": "timestamp when the run completed",
            "status": "status of the periodic agent",
            "prompt": "input prompt to agent,
            "agent_output": "...final response of agent",
            "log": "... full agent run log",
            "log_id": periodic agent log id.,
        }
        ```
The payload is encrypted using the `callback_secret` provided.

You can validate the payload using the X-Hub-Signature-256 signature header for request data.
This is a Sha256 encoded HMAC hex digest of the payload body.

```python
import hmac
import haslib

def validate_payload(request: HttpRequest, callback_secret: str):
    # Get the X-Hub-Signature-256 header from the request
    received_signature = request.META.get("HTTP_X_HUB_SIGNATURE_256", "")

    if not received_signature.startswith("sha256="):
        # Invalid signature format
        return False

    received_signature = received_signature[len("sha256=") :]

    try:
        # Get the raw request body
        payload = request.body

        # Compute the expected signature using the app_secret
        expected_signature = hmac.new(
            callback_secret.encode(), payload, hashlib.sha256
        ).hexdigest()

        if hmac.compare_digest(received_signature, expected_signature):
            # Signatures match, the payload is genuine
            return True
        else:
            # Signatures don't match
            return False
    except Exception as e:
        # Handle any errors that may occur during validation
        return False

```

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/periodic-agents/{id}/.get.description
Endpoint to create and view, update and delete periodic agents.

Periodic agents are schedulers issued for mentors. These are configured with input prompt (if any)
as well as a cron schedule to trigger the periodic agent.

Access to these are restricted to platform admins and tenant administrators

Session information for running the periodic agent will be generated with the credentials of the
user (platform administrator) who created the agent.

A Periodic Agent is allowed to have a `callback_url` and `callback_secret`.
When a `callback_url` is set for a Periodic Agent, a post request with data entries containing the log and timestamp
of the run will be made to the callback_url provided.
Here is the payload structure:
        ```
        {
            "timestamp": "timestamp when the run completed",
            "status": "status of the periodic agent",
            "prompt": "input prompt to agent,
            "agent_output": "...final response of agent",
            "log": "... full agent run log",
            "log_id": periodic agent log id.,
        }
        ```
The payload is encrypted using the `callback_secret` provided.

You can validate the payload using the X-Hub-Signature-256 signature header for request data.
This is a Sha256 encoded HMAC hex digest of the payload body.

```python
import hmac
import haslib

def validate_payload(request: HttpRequest, callback_secret: str):
    # Get the X-Hub-Signature-256 header from the request
    received_signature = request.META.get("HTTP_X_HUB_SIGNATURE_256", "")

    if not received_signature.startswith("sha256="):
        # Invalid signature format
        return False

    received_signature = received_signature[len("sha256=") :]

    try:
        # Get the raw request body
        payload = request.body

        # Compute the expected signature using the app_secret
        expected_signature = hmac.new(
            callback_secret.encode(), payload, hashlib.sha256
        ).hexdigest()

        if hmac.compare_digest(received_signature, expected_signature):
            # Signatures match, the payload is genuine
            return True
        else:
            # Signatures don't match
            return False
    except Exception as e:
        # Handle any errors that may occur during validation
        return False

```

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/periodic-agents/{id}/.get.parameters[].description
A unique integer value identifying this periodic agent.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/periodic-agents/{id}/.put.description
Endpoint to create and view, update and delete periodic agents.

Periodic agents are schedulers issued for mentors. These are configured with input prompt (if any)
as well as a cron schedule to trigger the periodic agent.

Access to these are restricted to platform admins and tenant administrators

Session information for running the periodic agent will be generated with the credentials of the
user (platform administrator) who created the agent.

A Periodic Agent is allowed to have a `callback_url` and `callback_secret`.
When a `callback_url` is set for a Periodic Agent, a post request with data entries containing the log and timestamp
of the run will be made to the callback_url provided.
Here is the payload structure:
        ```
        {
            "timestamp": "timestamp when the run completed",
            "status": "status of the periodic agent",
            "prompt": "input prompt to agent,
            "agent_output": "...final response of agent",
            "log": "... full agent run log",
            "log_id": periodic agent log id.,
        }
        ```
The payload is encrypted using the `callback_secret` provided.

You can validate the payload using the X-Hub-Signature-256 signature header for request data.
This is a Sha256 encoded HMAC hex digest of the payload body.

```python
import hmac
import haslib

def validate_payload(request: HttpRequest, callback_secret: str):
    # Get the X-Hub-Signature-256 header from the request
    received_signature = request.META.get("HTTP_X_HUB_SIGNATURE_256", "")

    if not received_signature.startswith("sha256="):
        # Invalid signature format
        return False

    received_signature = received_signature[len("sha256=") :]

    try:
        # Get the raw request body
        payload = request.body

        # Compute the expected signature using the app_secret
        expected_signature = hmac.new(
            callback_secret.encode(), payload, hashlib.sha256
        ).hexdigest()

        if hmac.compare_digest(received_signature, expected_signature):
            # Signatures match, the payload is genuine
            return True
        else:
            # Signatures don't match
            return False
    except Exception as e:
        # Handle any errors that may occur during validation
        return False

```

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/periodic-agents/{id}/.put.parameters[].description
A unique integer value identifying this periodic agent.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/periodic-agents/{id}/.patch.description
Endpoint to create and view, update and delete periodic agents.

Periodic agents are schedulers issued for mentors. These are configured with input prompt (if any)
as well as a cron schedule to trigger the periodic agent.

Access to these are restricted to platform admins and tenant administrators

Session information for running the periodic agent will be generated with the credentials of the
user (platform administrator) who created the agent.

A Periodic Agent is allowed to have a `callback_url` and `callback_secret`.
When a `callback_url` is set for a Periodic Agent, a post request with data entries containing the log and timestamp
of the run will be made to the callback_url provided.
Here is the payload structure:
        ```
        {
            "timestamp": "timestamp when the run completed",
            "status": "status of the periodic agent",
            "prompt": "input prompt to agent,
            "agent_output": "...final response of agent",
            "log": "... full agent run log",
            "log_id": periodic agent log id.,
        }
        ```
The payload is encrypted using the `callback_secret` provided.

You can validate the payload using the X-Hub-Signature-256 signature header for request data.
This is a Sha256 encoded HMAC hex digest of the payload body.

```python
import hmac
import haslib

def validate_payload(request: HttpRequest, callback_secret: str):
    # Get the X-Hub-Signature-256 header from the request
    received_signature = request.META.get("HTTP_X_HUB_SIGNATURE_256", "")

    if not received_signature.startswith("sha256="):
        # Invalid signature format
        return False

    received_signature = received_signature[len("sha256=") :]

    try:
        # Get the raw request body
        payload = request.body

        # Compute the expected signature using the app_secret
        expected_signature = hmac.new(
            callback_secret.encode(), payload, hashlib.sha256
        ).hexdigest()

        if hmac.compare_digest(received_signature, expected_signature):
            # Signatures match, the payload is genuine
            return True
        else:
            # Signatures don't match
            return False
    except Exception as e:
        # Handle any errors that may occur during validation
        return False

```

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/periodic-agents/{id}/.patch.parameters[].description
A unique integer value identifying this periodic agent.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/periodic-agents/{id}/.delete.description
Endpoint to create and view, update and delete periodic agents.

Periodic agents are schedulers issued for mentors. These are configured with input prompt (if any)
as well as a cron schedule to trigger the periodic agent.

Access to these are restricted to platform admins and tenant administrators

Session information for running the periodic agent will be generated with the credentials of the
user (platform administrator) who created the agent.

A Periodic Agent is allowed to have a `callback_url` and `callback_secret`.
When a `callback_url` is set for a Periodic Agent, a post request with data entries containing the log and timestamp
of the run will be made to the callback_url provided.
Here is the payload structure:
        ```
        {
            "timestamp": "timestamp when the run completed",
            "status": "status of the periodic agent",
            "prompt": "input prompt to agent,
            "agent_output": "...final response of agent",
            "log": "... full agent run log",
            "log_id": periodic agent log id.,
        }
        ```
The payload is encrypted using the `callback_secret` provided.

You can validate the payload using the X-Hub-Signature-256 signature header for request data.
This is a Sha256 encoded HMAC hex digest of the payload body.

```python
import hmac
import haslib

def validate_payload(request: HttpRequest, callback_secret: str):
    # Get the X-Hub-Signature-256 header from the request
    received_signature = request.META.get("HTTP_X_HUB_SIGNATURE_256", "")

    if not received_signature.startswith("sha256="):
        # Invalid signature format
        return False

    received_signature = received_signature[len("sha256=") :]

    try:
        # Get the raw request body
        payload = request.body

        # Compute the expected signature using the app_secret
        expected_signature = hmac.new(
            callback_secret.encode(), payload, hashlib.sha256
        ).hexdigest()

        if hmac.compare_digest(received_signature, expected_signature):
            # Signatures match, the payload is genuine
            return True
        else:
            # Signatures don't match
            return False
    except Exception as e:
        # Handle any errors that may occur during validation
        return False

```

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/periodic-agents/{id}/.delete.parameters[].description
A unique integer value identifying this periodic agent.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/periodic-agents/statis.get.description
Retrieve statistics for periodic agents, including counts of succeeded and failed tasks. A task is considered failed if its latest log has a failed status, and succeeded if its latest log has a success status. Query parameters can be used for filtering.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/pin-message/.get.description
Retrieve pinned sessions for a user.

Returns a lightweight paginated list of pinned sessions containing:
- session_id: UUID of the session
- mentor_unique_id: UUID of the mentor
- mentor: Object with unique_id (for backward compatibility)
- title: AI-generated session title
- messages: Array containing only the first message

Query Parameters:
    mentor: Filter by mentor unique_id, slug, or name (optional)

Args:
    request: The HTTP request.
    org: Organization key identifier.
    user_id: The username of the student.

Returns:
    Response: Paginated list of pinned sessions.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/pin-message/.get.parameters[].description
Filter by mentor unique_id, slug, or name

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/pin-message/.post.description
Create a pinned message for a user session.

Args:
    request: The HTTP request containing session details.
    org: Organization key identifier.
    user_id: The username of the student.

Returns:
    Response: Status 201 on success.

Raises:
    NotFound: If the student does not exist.
    ValidationError: If request data is invalid.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/pin-message/.delete.description
Delete a pinned message for a user.

Args:
    request: The HTTP request containing session details.
    org: Organization key identifier.
    user_id: The username of the student.

Returns:
    Response: Status 204 on success.

Raises:
    NotFound: If the student or pinned message does not exist.
    ValidationError: If request data is invalid.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/planned-jobs/.get.description
Endpoints for viewing jobs and their status
A job run refers to a task with steps that an agent is going to undertake.
You can filter job runs by their status.
Note that for a single user and a specified session, at most only one JobRun instance
is active at any point in time.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/planned-jobs/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/planned-jobs/.get.parameters[].description
A page number within the paginated result set.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/planned-jobs/{id}/.get.description
Endpoints for viewing jobs and their status
A job run refers to a task with steps that an agent is going to undertake.
You can filter job runs by their status.
Note that for a single user and a specified session, at most only one JobRun instance
is active at any point in time.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/planned-jobs/{id}/.get.parameters[].description
A unique integer value identifying this job run.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/playwright-scripts/.get.description
Endpoints for viewing playwright scripts and updating playwright scripts for a tenant and user.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/playwright-scripts/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/playwright-scripts/.get.parameters[].description
A page number within the paginated result set.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/playwright-scripts/.post.description
Endpoints for viewing playwright scripts and updating playwright scripts for a tenant and user.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/playwright-scripts/{id.get.description
Endpoints for viewing playwright scripts and updating playwright scripts for a tenant and user.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/playwright-scripts/{id.get.parameters[].description
A unique integer value identifying this play wright script.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/playwright-scripts/{id.put.description
Endpoints for viewing playwright scripts and updating playwright scripts for a tenant and user.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/playwright-scripts/{id.put.parameters[].description
A unique integer value identifying this play wright script.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/playwright-scripts/{id.patch.description
Endpoints for viewing playwright scripts and updating playwright scripts for a tenant and user.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/playwright-scripts/{id.patch.parameters[].description
A unique integer value identifying this play wright script.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/playwright-scripts/{id.delete.description
Endpoints for viewing playwright scripts and updating playwright scripts for a tenant and user.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/playwright-scripts/{id.delete.parameters[].description
A unique integer value identifying this play wright script.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/predictive-analytics/.post.description
Retrieve predictive analytics based on historical data variables.

Args:
    request: HTTP request containing predictive analytics input.
    org: Organization key identifier.

Returns:
    - 200: Object containing predicted data.
    - 400: When AI response cannot be loaded into JSON.
    - 404: When OpenAI key for the tenant is not set.
    - 429: When OpenAI request exceeds the rate limit.

Example:
    **POST** `/api/ai-prompt/orgs/main/users/johndoe/predictive-analytics/`

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/predictive-analytics/.post.requestBody.content.application/json.examples.PredictiveAnalyticsResponseExample.value.predictions[].narrative
The number of registered users has been relatively stable with some fluctuations. There is a slight increase in the number of registered users over time.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/predictive-analytics/.post.requestBody.content.application/json.examples.PredictiveAnalyticsResponseExample.value.predictions[].narrative
No courses have been enrolled recently, indicating a decline in enrollment. It is expected that the number of courses enrolled will remain at 0 for the next 31 data points.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/predictive-analytics/.post.responses.200.content.application/json.examples.PredictiveAnalyticsResponseExample.value.predictions[].narrative
The number of registered users has been relatively stable with some fluctuations. There is a slight increase in the number of registered users over time.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/predictive-analytics/.post.responses.200.content.application/json.examples.PredictiveAnalyticsResponseExample.value.predictions[].narrative
No courses have been enrolled recently, indicating a decline in enrollment. It is expected that the number of courses enrolled will remain at 0 for the next 31 data points.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/projects/.get.description
Retrieve a list of projects with optional filtering and search.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/projects/.get.parameters[].description
The initial index from which to return the results.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/projects/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/projects/.get.parameters[].description
Order by field (prefix with - for descending). Example: name or -created_at

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/projects/.get.responses.200.content.application/json.examples.ProjectsListExample.value.results[][].description
A collection of mentors for learning Python

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/projects/.post.description
Create a new project with optional mentors.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/projects/.post.requestBody.content.application/json.examples.CreateProjectRequest.value.description
A project for learning machine learning fundamentals

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/projects/.post.responses.201.content.application/json.examples.CreateProjectResponse.value.description
A project for learning machine learning fundamentals

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/projects/{id}/.get.description
Get detailed information about a specific project including its mentors.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/projects/{id}/.get.parameters[].description
A unique integer value identifying this Project.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/projects/{id}/.put.description
Update project information and optionally modify its mentors.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/projects/{id}/.put.parameters[].description
A unique integer value identifying this Project.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/projects/{id}/.patch.description
API ViewSet for managing projects.

Projects are groups of mentors that can be created by anyone (students and tenant admins).
They serve as a way to organize and group related mentors together.

Projects can be:
- Personal (shared=False): Only visible to their owners
- Shared (shared=True): Visible to platform admins and potentially other users

Projects are accessed through integrated URLs within the mentor router:
    /orgs/<org>/projects/ - All accessible projects in a platform (admin access)
    /orgs/<org>/projects/<id>/ - Specific project (admin access)
    /orgs/<org>/users/<user_id>/projects/ - User's projects (user access)
    /orgs/<org>/users/<user_id>/projects/<id>/ - User's specific project

Query Parameters:
    - username: Filter projects by owner's username (admin routes only)
    - shared: Filter by shared status (true/false)
    - search: Search in name and description
    - sort: Order by field (prefix with - for descending). Example: sort=name or sort=-created_at

Permissions:
    - GET: Accessible to project owners and platform admins (for shared projects)
    - POST: Any authenticated user can create projects
    - PUT, PATCH, DELETE: Accessible to project owners only

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/projects/{id}/.patch.parameters[].description
A unique integer value identifying this Project.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/projects/{id}/.delete.parameters[].description
A unique integer value identifying this Project.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/recent-messages/.get.description
Get recent chat sessions of a user within an organization.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/recent-messages/.get.parameters[].description
Filter by mentor unique_id, slug, or name

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/recently-accessed-ment.get.description
Endpoint for listing most recently accessed mentors.

Accessible to students and admins.


Returns:

    200: List of most recently accessed mentors.

    400: When request is not valid.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/recently-accessed-ment.get.responses.200.content.application/json.examples.SampleResponse.value[][].description
Upbeat, encouraging tutor helping            students understand concepts by            explaining ideas and asking questions.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/recently-accessed-ment.get.responses.200.content.application/json.examples.SampleResponse.value[][].description
A mentor that answers questions            about ibl.ai

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/recently-accessed-ment.get.responses.200.content.application/json.examples.SampleResponse.value[][].description
Upbeat, encouraging tutor helping students understand concepts by explaining ideas and asking questions.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/resources/web/.post.description
Search for web resources based on a query.

Args:
    request: The HTTP request containing the search query.
    org: The organization/tenant identifier.
    user_id: The ID of the user making the request.

Returns:
    Response: A list of web resources matching the query.

Raises:
    ValidationError: If the search fails or returns no results.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/resources/web/.post.responses.200.content.application/json.examples.WebResourcesResponseExample.value[][].content
Empowering Educators with Generative AI. All-in-one web and mobile AI tools for faculty support and student success: tutoring, content creation and automation.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/resources/web/.post.responses.200.content.application/json.examples.WebResourcesResponseExample.value[][].title
ibl.ai | Generative AI Platform for Education

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/resources/web/.post.responses.200.content.application/json.examples.WebResourcesResponseExample.value[][].metadata.title
ibl.ai | Generative AI Platform for Education

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/resources/web/.post.responses.200.content.application/json.examples.WebResourcesResponseExample.value[][].card.title
ibl.ai | Generative AI Platform for Education

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/resources/web/.post.responses.200.content.application/json.examples.WebResourcesResponseExample.value[][].card.description
New York-based gen AI and open source education company serving the Fortune 500, universities and governments.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/safety-logs/.get.description
Endpoint to view and delete Safety System Logs for a tenant.

These can be filtered by username, platform_key and  mentor id


A search query can be conducted to search through the prompts and reason for the moderation catch event.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/safety-logs/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/safety-logs/.get.parameters[].description
A page number within the paginated result set.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/safety-logs/.get.parameters[].description
* `Safety System` - Safety System
* `Moderation System` - Moderation System
* `Privacy System` - Privacy System

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/safety-logs/{id}/.get.description
Endpoint to view and delete Safety System Logs for a tenant.

These can be filtered by username, platform_key and  mentor id


A search query can be conducted to search through the prompts and reason for the moderation catch event.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/safety-logs/{id}/.get.parameters[].description
A unique integer value identifying this moderation log.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/safety-logs/{id}/.delete.description
Endpoint to view and delete Safety System Logs for a tenant.

These can be filtered by username, platform_key and  mentor id


A search query can be conducted to search through the prompts and reason for the moderation catch event.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/safety-logs/{id}/.delete.parameters[].description
A unique integer value identifying this moderation log.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/session-detail/mentors.get.description
Retrieve session details including message counts and timestamps.

Query Parameters:
    page (optional, int): Page number for pagination.

Returns:
    - 200: Paginated list of session details.
    - 404: Session not found.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/sessionid/.get.description
Retrieve user sessions filtered by start date and end date.

Query Parameters:
    start_date (optional, ISO format): Start date for filtering sessions.
    end_date (optional, ISO format): End date for filtering sessions.

Returns:
    - 200: List of session IDs with insertion timestamps.
    - 400: Invalid request parameters.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/sessions/.post.description
Retrieve or create a chat session with a mentor.

Passing `null` as `tools` results in using all tools assigned to the mentor.
To specify that no tools be used, pass an empty list.

Args:
    request: HTTP request containing mentor details.
    org: Organization key identifier.
    user_id (optional): Username for authentication (if required by the mentor).

Returns:
    Response: JSON object containing the session ID.

Raises:
    Http404: If the mentor is not found.
    ValidationError: If the username is invalid.
    ValidationError: If one or more tool slugs are invalid.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/sessions/.post.responses.200.content.application/json.examples.SuccessfulResponse.value.tools[].description
Tool to search for information from the web

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/sessions/{session_id}/.get.description
Fetches chat messages for a specific session.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/sessions/{session_id}/.put.description
Update the title of a chat session and its tools

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/sessions/{session_id}/.get.description
Endpoint to fetch the logs of a session.
Logs are cached for up to 1 hour of their creation: accessing the logs after an hour will result in an empty data.

This is intentional and made to avoid cases where logs bloat our in-memory db.

Accessible to tenant admins and students.

Url Args:
    org (str): The organization's platform key.
    user_id (str): The username  identifier of the individual.
    session_id (str): The session id.

Returns:

    200: a SessionBrowserScreenshot object

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/sessions/{session_id}/.post.description
Sets `disable_chathistory=True` on an existing session and nulls `Session.student` to sever the user↔session link. Subsequent messages are not written to ChatMessageHistory. Pre-toggle messages are NOT retroactively removed. The flag cannot be flipped back to False once set.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/sessions/{session_id}/.post.summary
Disable chat history on a session (one-way)

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/sessions/{session_id}/.post.responses.400.description
True→False transition rejected (one-way door)

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/sessions/{session_id}/.post.responses.404.description
Session not found in this org, or caller is not the owner / a platform admin.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/sessions/{session_id}/.get.description
Retrieves the chat history for a session as a plain text file.

Returns:
    200: txt file containing coversation

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/sessions/{session_id}/.get.description
Retrieve memory data for a specific session.

This endpoint returns the memory components (knowledge gaps, lessons learned,
help requests) that were generated during the specified chat session.

Args:
    org: The organization/tenant identifier.
    user_id: The ID of the user who owns the session.
    session_id: The ID of the session to retrieve memory for.

Returns:
    Response: The memory data associated with the session.

Raises:
    NotFound: If the session does not exist or does not belong to the user.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/sessions/{session_id}/.get.responses.200.content.application/json.examples.SessionMemoryResponseExample.value.memory.data[].content
Understanding of neural network architecture

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/sessions/{session_id}/.get.responses.404.description
Session not found or does not belong to user

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/sessions/{session_id}/.get.description
Fetches shared chat messages for a specific session.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/sessions/{session_id}/.put.description
Allows users to mark their session as shared. Anonymous users can only share sessions created in anonymous mode.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/sessions/{session_id}/.get.description
Retrieve shell logs for a specific session.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    user_id: The ID of the user who owns the session.
    session_id: The ID of the session to retrieve logs for.

Returns:
    Response: The shell logs for the specified session.

Raises:
    NotFound: If the specified session does not exist.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/sessions/{session_id}/.get.description
Retrieve a list of related questions based on a chat session.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/sessions/{session_id}/.get.description
Retrieves the chat history for a given session if the export task is ready.

Returns:

    200: When task is not ready.

    200: chat history object

    400: When data is not valid.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/settings/tenant-llm/.get.description
Retrieve all LLM models assigned to a specific tenant.

Args:
    request: The HTTP request.
    org: The unique identifier of the tenant.

Returns:
    Response: A list of LLM models assigned to the tenant.

Raises:
    NotFound: If the specified tenant does not have any associated models.
    ValidationError: If an unexpected error occurs.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/settings/tenant-llm/.post.description
Create or update an LLM model for a tenant.

Accessible only to tenant administrators.

Args:
    request: The HTTP request containing LLM model details.
    org: The unique identifier of the tenant.

Returns:
    Response: Details of the newly created or updated LLM model.

Raises:
    ValidationError: If request data is invalid.
    NotFound: If the tenant does not exist.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/settings/tenant-llm/.post.responses.201.content.application/json.examples.SuccessfulCreationResponse.value.info
LLM model for tenant created successfully.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/starred-mentors/.get.description
Retrieve a list of mentors starred by a specific user.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    user_id: The ID of the user to retrieve starred mentors for.

Returns:
    Response: A list of the user's starred mentors, sorted by most recently accessed.

Raises:
    NotFound: If the specified student does not exist.
    BadRequest: If the request is invalid.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/stop-generation/.post.description
Stops an ongoing LLM generation for a mentor chat session. The generation_id is returned when starting a chat and can be used to stop the generation before it completes.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/support-ticket-message.get.description
ViewSet for managing ticket messages.

This ViewSet provides endpoints to retrieve, create, and update ticket messages.

Permissions:
    - Platform Admins:
        - Platform admins are able to view all ticket messages for the tenant.
    - Students:
        - Students are able to view all ticket messages for only the ticket they are associated with.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/support-ticket-message.get.parameters[].description
A page number within the paginated result set.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/support-ticket-message.post.description
ViewSet for managing ticket messages.

This ViewSet provides endpoints to retrieve, create, and update ticket messages.

Permissions:
    - Platform Admins:
        - Platform admins are able to view all ticket messages for the tenant.
    - Students:
        - Students are able to view all ticket messages for only the ticket they are associated with.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/support-ticket-message.get.description
ViewSet for managing ticket messages.

This ViewSet provides endpoints to retrieve, create, and update ticket messages.

Permissions:
    - Platform Admins:
        - Platform admins are able to view all ticket messages for the tenant.
    - Students:
        - Students are able to view all ticket messages for only the ticket they are associated with.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/support-ticket-message.get.parameters[].description
A unique integer value identifying this ticket message.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/support-ticket-message.put.description
ViewSet for managing ticket messages.

This ViewSet provides endpoints to retrieve, create, and update ticket messages.

Permissions:
    - Platform Admins:
        - Platform admins are able to view all ticket messages for the tenant.
    - Students:
        - Students are able to view all ticket messages for only the ticket they are associated with.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/support-ticket-message.put.parameters[].description
A unique integer value identifying this ticket message.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/support-ticket-message.patch.description
ViewSet for managing ticket messages.

This ViewSet provides endpoints to retrieve, create, and update ticket messages.

Permissions:
    - Platform Admins:
        - Platform admins are able to view all ticket messages for the tenant.
    - Students:
        - Students are able to view all ticket messages for only the ticket they are associated with.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/support-ticket-message.patch.parameters[].description
A unique integer value identifying this ticket message.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/support-ticket-message.delete.description
ViewSet for managing ticket messages.

This ViewSet provides endpoints to retrieve, create, and update ticket messages.

Permissions:
    - Platform Admins:
        - Platform admins are able to view all ticket messages for the tenant.
    - Students:
        - Students are able to view all ticket messages for only the ticket they are associated with.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/support-ticket-message.delete.parameters[].description
A unique integer value identifying this ticket message.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/support-tickets/.get.description
ViewSet for managing Human Support Tickets.

This ViewSet provides endpoints to retrieve, create, and update Human Support Tickets.

Permissions:
    Platform Admins:
        - Platform admins are able to update the ticket status, and view all tickets for the tenant.
        - Platform admins can only update the `subject`, `description` and `status` fields.
    Students:
        - Students are only able to view their own created tickets.
        - students can modify only the `subject` and `description` entries

    Field Updates:
        - subject: Modifiable by both student and platform admin
        - description: Modifiable by only student.
        - status: Modifiable by only platform admin.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/support-tickets/.get.parameters[].description
A page number within the paginated result set.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/support-tickets/.get.parameters[].description
* `open` - Open
* `in_progress` - In Progress
* `closed` - Closed

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/support-tickets/{id}/.get.description
ViewSet for managing Human Support Tickets.

This ViewSet provides endpoints to retrieve, create, and update Human Support Tickets.

Permissions:
    Platform Admins:
        - Platform admins are able to update the ticket status, and view all tickets for the tenant.
        - Platform admins can only update the `subject`, `description` and `status` fields.
    Students:
        - Students are only able to view their own created tickets.
        - students can modify only the `subject` and `description` entries

    Field Updates:
        - subject: Modifiable by both student and platform admin
        - description: Modifiable by only student.
        - status: Modifiable by only platform admin.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/support-tickets/{id}/.get.parameters[].description
A unique integer value identifying this human support ticket.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/support-tickets/{id}/.put.description
ViewSet for managing Human Support Tickets.

This ViewSet provides endpoints to retrieve, create, and update Human Support Tickets.

Permissions:
    Platform Admins:
        - Platform admins are able to update the ticket status, and view all tickets for the tenant.
        - Platform admins can only update the `subject`, `description` and `status` fields.
    Students:
        - Students are only able to view their own created tickets.
        - students can modify only the `subject` and `description` entries

    Field Updates:
        - subject: Modifiable by both student and platform admin
        - description: Modifiable by only student.
        - status: Modifiable by only platform admin.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/support-tickets/{id}/.put.parameters[].description
A unique integer value identifying this human support ticket.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/support-tickets/{id}/.patch.description
ViewSet for managing Human Support Tickets.

This ViewSet provides endpoints to retrieve, create, and update Human Support Tickets.

Permissions:
    Platform Admins:
        - Platform admins are able to update the ticket status, and view all tickets for the tenant.
        - Platform admins can only update the `subject`, `description` and `status` fields.
    Students:
        - Students are only able to view their own created tickets.
        - students can modify only the `subject` and `description` entries

    Field Updates:
        - subject: Modifiable by both student and platform admin
        - description: Modifiable by only student.
        - status: Modifiable by only platform admin.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/support-tickets/{id}/.patch.parameters[].description
A unique integer value identifying this human support ticket.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/support-tickets/{id}/.delete.description
ViewSet for managing Human Support Tickets.

This ViewSet provides endpoints to retrieve, create, and update Human Support Tickets.

Permissions:
    Platform Admins:
        - Platform admins are able to update the ticket status, and view all tickets for the tenant.
        - Platform admins can only update the `subject`, `description` and `status` fields.
    Students:
        - Students are only able to view their own created tickets.
        - students can modify only the `subject` and `description` entries

    Field Updates:
        - subject: Modifiable by both student and platform admin
        - description: Modifiable by only student.
        - status: Modifiable by only platform admin.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/support-tickets/{id}/.delete.parameters[].description
A unique integer value identifying this human support ticket.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/support-tickets/{id}/c.post.description
Endpoint to close a Human support ticket.

This endpoint is used to close a Human support ticket.

Permissions:
    - available to both platform admins and the student who created the ticket.

Returns:
    Response: A response object containing the closed ticket data.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/support-tickets/{id}/c.post.parameters[].description
A unique integer value identifying this human support ticket.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/tasks/{task_id}.get.description
Retrieves the status of a task using its task ID.

Accessible to both tenant admins and students.

Returns:

    200: task id

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/tasks/sessions/{sessio.post.description
Export chat history for a session.

Returns:
    200: Task ID for the export operation.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/voices/.get.description
Retrieve a list of available voice options.

Args:
    request: The HTTP request.

Returns:
    Response: A list of available voice options.

Raises:
    NotFound: If no voice options are available.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/voices/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/voices/.get.parameters[].description
A page number within the paginated result set.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/voices/.get.parameters[].description
* `browser` - Browser
* `openai` - Openai
* `google` - Google
* `elevenlabs` - Elevenlabs

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/voices/{id}/.get.description
Retrieve details of a specific voice option.

Args:
    request: The HTTP request.
    pk: The primary key of the voice option to retrieve.

Returns:
    Response: The details of the specified voice option.

Raises:
    NotFound: If the specified voice option does not exist.

# paths./api/ai-mentor/orgs/{org}/users/{user_id}/voices/{id}/.get.parameters[].description
A unique integer value identifying this voice.

# paths./api/ai-mentor/orgs/{org}/workflows/.get.description
Retrieve a list of workflows in the platform with optional filtering and search.

# paths./api/ai-mentor/orgs/{org}/workflows/.get.parameters[].description
The initial index from which to return the results.

# paths./api/ai-mentor/orgs/{org}/workflows/.get.parameters[].description
Order by field (prefix with - for descending). Example: name or -created_at

# paths./api/ai-mentor/orgs/{org}/workflows/.post.description
Create a new workflow definition. Basic ReactFlow JSON validation is performed.

# paths./api/ai-mentor/orgs/{org}/workflows/.post.requestBody.content.application/json.examples.CreateWorkflowRequest.value.description
A workflow that chains multiple mentors for comprehensive learning

# paths./api/ai-mentor/orgs/{org}/workflows/{unique_id}/.get.description
Get detailed information about a specific workflow.

# paths./api/ai-mentor/orgs/{org}/workflows/{unique_id}/.put.description
Update workflow information. Basic ReactFlow JSON validation is performed.

# paths./api/ai-mentor/orgs/{org}/workflows/{unique_id}/.patch.description
API ViewSet for managing workflows.

Provides CRUD operations for workflow definitions with platform-scoped access.
All operations require platform admin permissions.

Endpoints:
- GET /orgs/<org>/workflows/ - List workflows in platform
- POST /orgs/<org>/workflows/ - Create new workflow
- GET /orgs/<org>/workflows/<unique_id>/ - Retrieve workflow
- PUT/PATCH /orgs/<org>/workflows/<unique_id>/ - Update workflow
- DELETE /orgs/<org>/workflows/<unique_id>/ - Delete workflow
- POST /orgs/<org>/workflows/<unique_id>/validate/ - Validate workflow for execution
- POST /orgs/<org>/workflows/<unique_id>/publish/ - Save, validate, and activate
- POST /orgs/<org>/workflows/<unique_id>/activate/ - Validate and activate (no save)
- POST /orgs/<org>/workflows/<unique_id>/deactivate/ - Take offline
- POST /orgs/<org>/workflows/<unique_id>/unpublish/ - Alias for deactivate
- GET/POST /orgs/<org>/workflows/<unique_id>/chat/ - Get entry mentor info for chat

Query Parameters:
- search: Search in name and description fields
- is_active: Filter by active status (true/false)
- is_template: Filter by template status (true/false)
- created_by: Filter by creator username
- sort: Order by field (prefix with - for descending)
  Examples: sort=name, sort=-created_at, sort=updated_at

Permissions:
- Uses RBAC for fine-grained access control
- Owner-based access via created_by field

Note: The 'org' URL parameter maps to Platform.key (platform key).
This is a naming convention in the codebase for consistency.

# paths./api/ai-mentor/orgs/{org}/workflows/{unique_id}/activate/.post.description
Validate and activate an already-saved workflow. Unlike publish, this does not save changes - it uses the current saved state.

# paths./api/ai-mentor/orgs/{org}/workflows/{unique_id}/chat/.post.description
Send a message to the workflow and receive a response. The workflow must be active. Messages are routed through the entry mentor.

# paths./api/ai-mentor/orgs/{org}/workflows/{unique_id}/deactivate/.post.description
Take a workflow offline while preserving its saved state.

# paths./api/ai-mentor/orgs/{org}/workflows/{unique_id}/publish/.post.description
Save, validate, and activate a workflow in one operation. Optionally accepts partial workflow updates in the request body. If validation fails, the workflow is saved but not activated.

# paths./api/ai-mentor/orgs/{org}/workflows/{unique_id}/unpublish/.post.description
Alias for deactivate. Takes a workflow offline while preserving its saved state.

# paths./api/ai-mentor/orgs/{org}/workflows/{unique_id}/validate/.post.description
Phase 2: Comprehensive execution validation. Validates workflow definition for schema, connectivity, security, and executability. This is separate from the basic validation done during create/update, allowing users to save draft workflows.

# paths./api/ai-mentor/orgs/{org}/workflows/node-types/.get.description
Returns metadata about all available workflow node types. Use this endpoint to populate the workflow editor with available nodes, their categories, required fields, and configuration options.

# paths./api/ai-mentor/voice-transcription/health/.get.description
Health check for the voice transcription provider.

Optional query params:
    - ``provider``: one of ``openai``, ``google``, ``groq``. Defaults to ``openai``.
    - ``tenant``: tenant key whose credentials should be used. Falls back
      to global credentials when omitted.

Returns 200 if the provider transcribed a synthetic silent audio sample
successfully (an empty transcript is still a successful round-trip).
Returns 503 with details otherwise.

# paths./api/ai-mentor/webhooks/n8n-progress/.post.description
This is the endpoint called by N8N workflows from N8N, to report progress to the mentor SPA(DM)

Example request:
```
{"unique_id": "the-unique-id", "progress": "the email was successfully sent.", "finished": false}
```

# paths./api/ai-prompt/orgs/{org}/metadata/.post.description
Create or update metadata for a prompt.

Args:
    request: The HTTP request containing the metadata.
    org: The organization/tenant identifier.

Returns:
    Response: The created or updated prompt metadata.

Raises:
    BadRequest: If the provided data is invalid.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/all-chats-memory/.get.description
Retrieve chat memory for a specific user.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    user_id: The ID of the user to retrieve chat memory for.

Returns:
    Response: The user's chat memory entries.

Raises:
    NotFound: If no chat memory exists for the user.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/all-chats-memory/.get.responses.200.content.application/json.examples.UserChatMemoryResponseExample.value.content
Previous conversation context about machine learning concepts.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/all-chats-memory/.post.description
Create a new chat memory entry for a user.

Args:
    request: The HTTP request containing the chat memory data.
    org: The organization/tenant identifier.
    user_id: The ID of the user to create chat memory for.

Returns:
    Response: The created chat memory entry.

Raises:
    BadRequest: If the provided data is invalid.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/all-chats-memory/.post.requestBody.content.application/json.examples.CreateChatMemoryRequestExample.value.content
Previous conversation context about machine learning concepts.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/all-chats-memory/.post.responses.201.content.application/json.examples.CreateChatMemoryResponseExample.value.content
Previous conversation context about machine learning concepts.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/all-chats-memory/.put.description
Update chat memory for a specific user.

Args:
    request: The HTTP request containing the updated chat memory data.
    org: The organization/tenant identifier.
    user_id: The ID of the user to update chat memory for.

Returns:
    Response: A confirmation of the scheduled update task.

Raises:
    BadRequest: If the provided data is invalid.
    NotFound: If no chat memory exists for the user.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/all-chats-memory/.delete.description
Delete all chat memory for a specific user.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    user_id: The ID of the user to delete chat memory for.

Returns:
    Response: A success message if the memory was deleted.

Raises:
    NotFound: If no chat memory exists for the user.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/all-chats-memory/{memo.put.description
Update a specific chat memory entry.

Args:
    request: The HTTP request containing the updated chat memory data.
    org: The organization/tenant identifier.
    user_id: The ID of the user who owns the memory.
    memory_id: The ID of the specific memory entry to update.

Returns:
    Response: The updated chat memory entry.

Raises:
    BadRequest: If the provided data is invalid.
    NotFound: If the specified memory entry does not exist.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/all-chats-memory/{memo.put.requestBody.content.application/json.examples.UpdateChatMemoryRequestExample.value.content
Updated conversation context about machine learning concepts.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/all-chats-memory/{memo.put.responses.200.content.application/json.examples.UpdateChatMemoryResponseExample.value.content
Updated conversation context about machine learning concepts.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/all-chats-memory/{memo.delete.description
Delete a specific chat memory entry.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    user_id: The ID of the user who owns the memory.
    memory_id: The ID of the specific memory entry to delete.

Returns:
    Response: A success message if the memory was deleted.

Raises:
    NotFound: If the specified memory entry does not exist.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/chat-memory-status/.get.description
Retrieve the chat memory status for a specific user.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    user_id: The ID of the user to retrieve memory status for.

Returns:
    Response: The user's chat memory status.

Raises:
    NotFound: If no memory status exists for the user.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/chat-memory-status/.put.description
Update the chat memory status for a specific user.

Args:
    request: The HTTP request containing the updated status.
    org: The organization/tenant identifier.
    user_id: The ID of the user to update memory status for.

Returns:
    Response: The updated chat memory status.

Raises:
    BadRequest: If the provided data is invalid.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/languages/.get.description
Retrieve all available prompt languages.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    user_id: The ID of the user making the request.

Returns:
    Response: A list of available prompt languages.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/languages/.post.description
Create a new prompt language.

Args:
    request: The HTTP request containing the language data.
    org: The organization/tenant identifier.
    user_id: The ID of the user creating the language.

Returns:
    Response: The created prompt language.

Raises:
    BadRequest: If the provided data is invalid.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/languages/{language_id.put.description
Update a specific prompt language.

Args:
    request: The HTTP request containing the updated language data.
    org: The organization/tenant identifier.
    user_id: The ID of the user making the request.
    language_id: The ID of the language to update.

Returns:
    Response: The updated prompt language.

Raises:
    BadRequest: If the provided data is invalid.
    NotFound: If the specified language does not exist.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/languages/{language_id.delete.description
Delete a specific prompt language.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    user_id: The ID of the user making the request.
    language_id: The ID of the language to delete.

Returns:
    Response: A success message if the language was deleted.

Raises:
    NotFound: If the specified language does not exist.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/memory/.get.description
Retrieve catalog item memory for a specific user.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    user_id: The ID of the user to retrieve catalog item memory for.

Returns:
    Response: The user's catalog item memory entries.

Raises:
    NotFound: If no catalog item memory exists for the user.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/memory/.post.description
Create a new catalog item memory entry for a user.

Args:
    request: The HTTP request containing the catalog item memory data.
    org: The organization/tenant identifier.
    user_id: The ID of the user to create catalog item memory for.

Returns:
    Response: The created catalog item memory entry.

Raises:
    BadRequest: If the provided data is invalid.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/memory/.post.requestBody.content.application/json.examples.CreateCatalogItemMemoryRequestExample.summary
Create Catalog Item Memory Request Example

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/memory/.post.responses.201.content.application/json.examples.CreateCatalogItemMemoryResponseExample.summary
Create Catalog Item Memory Response Example

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/memory/.delete.description
Delete all catalog item memory for a specific user.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    user_id: The ID of the user to delete catalog item memory for.

Returns:
    Response: A success message if the memory was deleted.

Raises:
    NotFound: If no catalog item memory exists for the user.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/memory-context/.get.description
Retrieve a user's memory context settings.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/memory-context/.put.description
Updates the user's memory context settings.

Returns:

    200: list of user memory context data.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/memory-status/.get.description
Retrieve the memory status for a specific user.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    user_id: The ID of the user to retrieve memory status for.

Returns:
    Response: The user's memory status.

Raises:
    NotFound: If no memory status exists for the user.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/memory-status/.put.description
Update the memory status for a specific user.

Args:
    request: The HTTP request containing the updated status.
    org: The organization/tenant identifier.
    user_id: The ID of the user to update memory status for.

Returns:
    Response: The updated memory status.

Raises:
    BadRequest: If the provided data is invalid.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/memory/{memory_id}/.put.description
Update a specific catalog item memory entry.

Args:
    request: The HTTP request containing the updated catalog item memory data.
    org: The organization/tenant identifier.
    user_id: The ID of the user who owns the memory.
    memory_id: The ID of the specific memory entry to update.

Returns:
    Response: The updated catalog item memory entry.

Raises:
    BadRequest: If the provided data is invalid.
    NotFound: If the specified memory entry does not exist.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/memory/{memory_id}/.put.requestBody.content.application/json.examples.UpdateCatalogItemMemoryRequestExample.summary
Update Catalog Item Memory Request Example

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/memory/{memory_id}/.put.responses.200.content.application/json.examples.UpdateCatalogItemMemoryResponseExample.summary
Update Catalog Item Memory Response Example

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/memory/{memory_id}/.delete.description
Delete a specific catalog item memory entry.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    user_id: The ID of the user who owns the memory.
    memory_id: The ID of the specific memory entry to delete.

Returns:
    Response: A success message if the memory was deleted.

Raises:
    NotFound: If the specified memory entry does not exist.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/metadata.get.description
Retrieve metadata for a prompt.

Args:
    request: The HTTP request.
    org: The organization/tenant identifier.
    user_id: The ID of the user making the request.

Returns:
    Response: The prompt metadata.

Raises:
    NotFound: If no metadata exists for the specific prompt

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompt/.get.description
API viewset for managing prompts.

This view allows tenant admins and students to create, retrieve, update,
and filter prompts based on various parameters.

Permissions:
    - Accessible to both tenant administrators and students

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompt/.get.parameters[].description
Option to filter by username of the prompt creators.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompt/.get.parameters[].description
Filter options include, date, prompt, default is date

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompt/.get.parameters[].description
Visibility trype the mentor of the prompt

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompt/.post.description
Create a new prompt.

Args:
    request: HTTP request containing prompt data.

Returns:
    Response with created prompt details.

Raises:
    ValidationError: If the input data is invalid.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompt/.post.parameters[].description
Option to filter by username of the prompt creators.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompt/.post.parameters[].description
Filter options include, date, prompt, default is date

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompt/.post.parameters[].description
Visibility trype the mentor of the prompt

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompt/{id}/.get.description
API viewset for managing prompts.

This view allows tenant admins and students to create, retrieve, update,
and filter prompts based on various parameters.

Permissions:
    - Accessible to both tenant administrators and students

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompt/{id}/.get.parameters[].description
Option to filter by username of the prompt creators.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompt/{id}/.get.parameters[].description
Filter options include, date, prompt, default is date

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompt/{id}/.get.parameters[].description
A unique integer value identifying this prompt.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompt/{id}/.get.parameters[].description
Visibility trype the mentor of the prompt

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompt/{id}/.put.description
Update an existing prompt.

Args:
    request: HTTP request containing updated prompt data.

Returns:
    Response with updated prompt details.

Raises:
    ValidationError: If the input data is invalid.
    PermissionDenied: If the prompt is system-generated and cannot be edited.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompt/{id}/.put.parameters[].description
Option to filter by username of the prompt creators.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompt/{id}/.put.parameters[].description
Filter options include, date, prompt, default is date

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompt/{id}/.put.parameters[].description
A unique integer value identifying this prompt.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompt/{id}/.put.parameters[].description
Visibility trype the mentor of the prompt

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompt/{id}/.patch.description
API viewset for managing prompts.

This view allows tenant admins and students to create, retrieve, update,
and filter prompts based on various parameters.

Permissions:
    - Accessible to both tenant administrators and students

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompt/{id}/.patch.parameters[].description
Option to filter by username of the prompt creators.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompt/{id}/.patch.parameters[].description
Filter options include, date, prompt, default is date

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompt/{id}/.patch.parameters[].description
A unique integer value identifying this prompt.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompt/{id}/.patch.parameters[].description
Visibility trype the mentor of the prompt

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompt/{id}/.delete.description
API viewset for managing prompts.

This view allows tenant admins and students to create, retrieve, update,
and filter prompts based on various parameters.

Permissions:
    - Accessible to both tenant administrators and students

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompt/{id}/.delete.parameters[].description
Option to filter by username of the prompt creators.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompt/{id}/.delete.parameters[].description
Filter options include, date, prompt, default is date

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompt/{id}/.delete.parameters[].description
A unique integer value identifying this prompt.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompt/{id}/.delete.parameters[].description
Visibility trype the mentor of the prompt

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompts/category/.get.description
Retrieve a list of prompt categories.

Query Parameters:
    - filter_by (optional): Sorts categories by name if set to "name".

Args:
    request: The HTTP request.
    org: Organization key identifier.

Returns:
    - 200: List of prompt categories.
    - 400: If query parameters are invalid.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompts/category/.get.parameters[].description
Filter options include, date, name, default is date 

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompts/category/.post.description
Create a new prompt category.

Args:
    request: The HTTP request containing category information.
    org: Organization key identifier.
    user_id: User performing the request.

Returns:
    - 201: Created prompt category.
    - 401: If the user is not a tenant admin.
    - 400: If request data is invalid.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompts/category/.delete.description
Delete a prompt category.

Args:
    request: The HTTP request containing the category to delete.
    org: Organization key identifier.
    user_id: User performing the request.

Returns:
    - 204: No Content (successful deletion).
    - 401: If the user is not a tenant admin.
    - 400: If request data is invalid.
    - 404: If the category does not exist.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompts/public/.get.description
API viewset for managing prompts.

This view allows anyone to retrieve,
and filter prompts based on various parameters.

Permissions:
    - Accessible to anyone

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompts/public/.get.parameters[].description
Option to filter by username of the prompt creators.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompts/public/.get.parameters[].description
Filter options include, date, prompt, default is date

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompts/public/.get.parameters[].description
Visibility trype the mentor of the prompt

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompts/public/{id}/.get.description
API viewset for managing prompts.

This view allows anyone to retrieve,
and filter prompts based on various parameters.

Permissions:
    - Accessible to anyone

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompts/public/{id}/.get.parameters[].description
Option to filter by username of the prompt creators.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompts/public/{id}/.get.parameters[].description
Filter options include, date, prompt, default is date

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompts/public/{id}/.get.parameters[].description
A unique integer value identifying this prompt.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/prompts/public/{id}/.get.parameters[].description
Visibility trype the mentor of the prompt

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/sessions/{session_id}/.get.description
Fetches AI-generated guided prompts for a given session and organization.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/sessions/{session_id}/.get.summary
Retrieve guided prompts for a chat session

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/sessions/{session_id}/.get.responses.200.content.application/json.examples.SuccessfulResponse.value.ai_prompts[]
What are the benefits of regular exercise?

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/sessions/{session_id}/.get.responses.200.content.application/json.examples.SuccessfulResponse.value.ai_prompts[]
What are some effective stress management techniques?

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/sessions/{session_id}/.get.responses.404.content.application/json.examples.OpenAIAPIKeyNotFound.value.error
OpenAI API key for tenant (main) not found.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/styles/.get.description
Endpoint for getting prompt styles.

Accessible to tenant admins and students.

Returns:

    200: List of styles.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/styles/.post.description
Endpoint for Adding prompt style.

Accessible to tenant admins only.

Returns:

    201: style Object.

    400: When data is not valid.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/styles/{style_id}/.put.description
Endpoint for Adding prompt style.

Accessible to tenant admins only.

Returns:

    200: style Object.

    400: When data is not valid.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/styles/{style_id}/.delete.description
Endpoint for deleting prompt style.

Accessible to tenant admins and students.

Returns:

    204: No response data.

    400: When data is not valid.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/tags/.get.description
Endpoint for getting prompt tags.

Accessible to tenant admins and students.

Returns:

    200: List of tags.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/tags/.post.description
Endpoint for Adding prompt tag.

Accessible to tenant admins and students.

Returns:

    201: tag Object.

    400: When data is not valid.



Example:

    POST: /api/ai-prompt/orgs/main/users/johndoe/tags/

    Request:        Response:       {
                        "name": "Programming",
                        "description": "tags for programing prompts"
                    }

    Response:       {
                        "id": 1,
                        "name": "Programming",
                        "description": "tags for programing prompts"
                    }

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/tags/{tag_id}/.put.description
Endpoint for updating prompt tag.

Accessible to tenant admins and students.

Returns:

    200: tag Object.

    400: When data is not valid.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/tags/{tag_id}/.delete.description
Endpoint for deleting prompt tag.

Accessible to tenant admins and students.

Returns:

    204: No response data.

    400: When data is not valid.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/tones/.get.description
Endpoint for getting prompt tones.

Accessible to tenant admins and students.

Returns:

    200: List of tones.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/tones/.post.description
Endpoint for Adding prompt tone.

Accessible to tenant admins only.

Returns:

    201: tone Object.

    400: When data is not valid.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/tones/{tone_id}/.put.description
Endpoint for updating prompt tone.

Accessible to tenant admins only.

Returns:

    200: tone Object.

    400: When data is not valid.

# paths./api/ai-prompt/orgs/{org}/users/{user_id}/tones/{tone_id}/.delete.description
Endpoint for deleting prompt tone.

Accessible to tenant admins and students.

Returns:

    204: No response data.

    400: When data is not valid.

# paths./api/ai-proxy/orgs/{org}/services/.get.description
Returns a list of all enabled external proxy services. Use this endpoint to discover which services are available for proxying.

# paths./api/ai-proxy/orgs/{org}/services/{service}/.get.description
Returns detailed information about a specific external proxy service, including all available endpoints and their configurations. Use this to discover what actions are available for a service.

# paths./api/ai-proxy/orgs/{org}/services/{service}/{action}/.post.description
Proxy a request to an external service endpoint. The service and action must be pre-configured in the system. Credentials are automatically injected based on the service's credential policy.

# paths./api/ai-proxy/orgs/{org}/services/{service}/{action}/.post.responses.200.description
Successful response from the upstream service. Response format depends on the endpoint configuration (JSON or binary).

# paths./api/ai-proxy/orgs/{org}/services/{service}/{action}/.post.responses.400.description
Invalid request or credential policy error.

# paths./api/ai-proxy/orgs/{org}/services/{service}/{action}/.post.responses.404.description
Service, endpoint, or credentials not found.

# paths./api/ai-search/mentors/.get.description
        Search and filter AI mentors with support for comprehensive filtering, pagination, and detailed mentor information.
        This endpoint supports both anonymous and authenticated users with different access levels.

        **Anonymous Users:**
        - Access to public mentors only (VIEWABLE_BY_ANYONE)
        - Limited search capabilities
        - No personalization

        **Authenticated Users:**
        - Full access based on platform permissions (scoped to requested platform)
        - Personalized results
        - Access to tenant-specific mentors

        **Required Parameters (Authenticated Users):**
        - `platform_key` OR `tenant`: Platform key for RBAC enforcement (required for authenticated requests)
          - Use `platform_key` (preferred) or `tenant` (backward compatibility) - both serve the same purpose
          - If both are provided, `platform_key` takes precedence

        **Available Filters:**
        - `query`: Search term to filter mentors by name or description
        - `tenant`: Filter by tenant/organization platform key(s) - can also be used as alias for `platform_key` (backward compatibility)
        - `category`: Filter by mentor category (comma-separated)
        - `subjects`: Filter by mentor subject (comma-separated)
        - `types`: Filter by mentor type (comma-separated)
        - `llm`: Filter by LLM provider (comma-separated, e.g., GPT-4, Claude)
        - `visibility`: Filter by visibility level (comma-separated: viewable_by_anyone, viewable_by_tenant_students, viewable_by_tenant_admins)
        - `created_by`: Filter mentors created by specific user (for personalized search)
        - `include_main_public_mentors`: Include main tenant public mentors

        **Facets:**
        The response includes facets with aggregated counts for all filterable attributes:
        - categories, subjects, types, llm_providers, visibility
        All facet values can be used as filter parameters in subsequent requests.

        Notes:
        - Detail view is removed; use the ibl_ai_mentor app for mentor details
        - include_main_public_mentors=true shows only VIEWABLE_BY_ANYONE mentors from the main tenant across tenants
        - For authenticated requests, either `platform_key` or `tenant` is required when username is provided
        - `tenant` parameter serves dual purpose: as a filter for multiple tenants, or as an alias for `platform_key` (backward compatibility)
        - Frontend uses `llm` parameter name (backend maps to `llm_provider` automatically)
        

# paths./api/ai-search/mentors/.get.summary
Search and filter AI mentors across the platform

# paths./api/ai-search/mentors/.get.parameters[].description
Sort alphabetically by name (shorthand for order_by='name'). When true, overrides order_by parameter.

# paths./api/ai-search/mentors/.get.parameters[].description
Filter mentors created by specific user (for personalized search)

# paths./api/ai-search/mentors/.get.parameters[].description
Include main tenant public mentors (VIEWABLE_BY_ANYONE) when true

# paths./api/ai-search/mentors/.get.parameters[].description
Field to sort results by ('created_at', '-created_at', 'recently_accessed_at', '-recently_accessed_at', 'name', '-name'). Use '-' prefix for descending order.

# paths./api/ai-search/mentors/.get.parameters[].description
Sort direction ('asc' or 'desc'). Only used if order_by doesn't start with '-'. Defaults to 'desc'.

# paths./api/ai-search/mentors/.get.parameters[].description
Platform key for RBAC enforcement. Required for authenticated requests. Can also use 'tenant' parameter as an alias (backward compatibility).

# paths./api/ai-search/mentors/.get.parameters[].description
Filter by starred status (true/false) - only for authenticated users

# paths./api/ai-search/mentors/.get.parameters[].description
Tenant key(s) (CSV). Can be used as a filter for multiple tenants, or as an alias for 'platform_key' (backward compatibility).

# paths./api/ai-search/mentors/.get.responses.200.content.application/json.examples.AnonymousUserSearch.description
Search for computer science mentors as an anonymous user

# paths./api/ai-search/mentors/.get.responses.200.content.application/json.examples.AuthenticatedUserSearch.description
Search for data science mentors as an authenticated user with multiple filters

# paths./api/ai-search/orgs/{org}/users/{username}/my-mentors/.get.parameters[].description
Field to sort results by ('created_at', 'recently_accessed_at')

# paths./api/ai-search/orgs/{org}/users/{username}/my-mentors/.get.parameters[].description
Search term to filter mentors by name or description

# paths./api/ai-search/personalized-mentors/.get.description
        Get mentors created by a specific user within a given organization/platform.
        This endpoint provides a personalized view of the user's own mentors with
        support for filtering, pagination, and detailed mentor information.

        **Authentication Required:**
        - username: Required for personalized mentor access
        - platform_key OR tenant: Required for tenant-specific content (both serve the same purpose)
          - Use `platform_key` (preferred) or `tenant` (backward compatibility)
          - If both are provided, `platform_key` takes precedence

        **Features:**
        - User's own mentors only
        - Personalization data (access counts, last used)
        - Filtering and faceted search
        - Pagination support
        - Detail and list views
        

# paths./api/ai-search/personalized-mentors/.get.parameters[].description
LLM provider filter (frontend uses 'llm', backend maps to 'llm_provider')

# paths./api/ai-search/personalized-mentors/.get.parameters[].description
Sort direction

* `asc` - asc
* `desc` - desc

# paths./api/ai-search/personalized-mentors/.get.parameters[].description
Platform key for authentication. Required for authenticated requests. Can also use 'tenant' parameter as an alias (backward compatibility).

# paths./api/ai-search/personalized-mentors/.get.parameters[].description
Tenant key (alias for 'platform_key' for backward compatibility). Can be used instead of 'platform_key' - both serve the same purpose.

# paths./api/ai-search/personalized-mentors/.get.parameters[].description
Username for authentication (required for unauthenticated requests)

# paths./api/ai-search/personalized-mentors/.get.responses.200.content.application/json.examples.FilterByCategory.description
Filter user's mentors by category and visibility

# paths./api/ai-search/prompts/.get.description
Get all recommendation prompts for a specific platform. Optionally filter by SPA URL or recommendation type.

# paths./api/ai-search/prompts/.get.summary
List recommendation prompts for a platform

# paths./api/ai-search/prompts/.post.description
Create a new recommendation prompt for a platform and SPA.

# paths./api/ai-search/prompts/.post.requestBody.content.application/json.examples.CreateCoursePrompt.value.prompt_text
Focus on technical skills and certifications...

# paths./api/ai-search/prompts/.post.responses.201.content.application/json.examples.CreateCoursePrompt.value.prompt_text
Focus on technical skills and certifications...

# paths./api/ai-search/prompts/.post.responses.409.description
Prompt already exists for this combination

# paths./api/ai-search/prompts/.put.description
Update an existing prompt by ID. Must provide platform_key to verify ownership.

# paths./api/ai-search/prompts/.put.summary
Update an existing recommendation prompt

# paths./api/ai-search/prompts/.put.responses.403.description
Admin permissions required or platform mismatch

# paths./api/ai-search/prompts/.delete.description
Delete a recommendation prompt by ID. Must provide platform_key to verify ownership. This permanently removes the prompt.

# paths./api/ai-search/prompts/.delete.responses.403.description
Admin permissions required or platform mismatch

# paths./api/ai-search/recommendation/prompts/.get.description
Get all recommendation prompts for a specific platform. Optionally filter by SPA URL or recommendation type.

# paths./api/ai-search/recommendation/prompts/.get.summary
List recommendation prompts for a platform

# paths./api/ai-search/recommendation/prompts/.post.description
Create a new recommendation prompt for a platform and SPA.

# paths./api/ai-search/recommendation/prompts/.post.requestBody.content.application/json.examples.CreateCoursePrompt.value.prompt_text
Focus on technical skills and certifications...

# paths./api/ai-search/recommendation/prompts/.post.responses.201.content.application/json.examples.CreateCoursePrompt.value.prompt_text
Focus on technical skills and certifications...

# paths./api/ai-search/recommendation/prompts/.post.responses.409.description
Prompt already exists for this combination

# paths./api/ai-search/recommendation/prompts/.put.description
Update an existing prompt by ID. Must provide platform_key to verify ownership.

# paths./api/ai-search/recommendation/prompts/.put.summary
Update an existing recommendation prompt

# paths./api/ai-search/recommendation/prompts/.put.responses.403.description
Admin permissions required or platform mismatch

# paths./api/ai-search/recommendation/prompts/.delete.description
Delete a recommendation prompt by ID. Must provide platform_key to verify ownership. This permanently removes the prompt.

# paths./api/ai-search/recommendation/prompts/.delete.responses.403.description
Admin permissions required or platform mismatch

# paths./api/ai-search/recommendations/.get.description
        Generate personalized course recommendations using AI that considers the user's
        learning history, organizational goals, and available courses.

        **Authentication Required:**
        - User must be authenticated
        - Platform key must be provided
        - User must have access to the specified platform

        **How It Works:**
        1. Fetches tenant's custom recommendation prompt (if configured)
        2. Analyzes user's course completion history and performance
        3. Reviews available course catalog
        4. Uses AI to match courses to user's needs and organizational goals
        5. Returns 3-5 courses with clear explanations

        **Tenant Prompts:**
        Each organization can configure custom prompts that guide recommendations.
        For example: "Prioritize leadership for sales roles" or "Focus on technical skills."

        **Use Cases:**
        - Manual recommendation requests by users
        - Post-assessment recommendations
        - Milestone-triggered suggestions
        - Learning path planning
        

# paths./api/ai-search/recommendations/.get.parameters[].description
Assessment ID if triggered by assessment completion

# paths./api/ai-search/recommendations/.get.parameters[].description
Filter recommendations to specific difficulty levels (CSV)

# paths./api/ai-search/recommendations/.get.parameters[].description
Filter recommendations to specific domains (CSV)

# paths./api/ai-search/recommendations/.get.parameters[].description
Include items from 'main' tenant catalog IN ADDITION TO platform-specific catalog. By default, only platform-specific data is returned (tenant isolation). Set to True to also include shared 'main' tenant resources.

# paths./api/ai-search/recommendations/.get.parameters[].description
Include user's learning history (completed courses, topics) in the RAG search query. Helps find content that builds on their background.

# paths./api/ai-search/recommendations/.get.parameters[].description
Include user's skills and badges in the RAG search query. Helps personalize results based on what the user already knows.

# paths./api/ai-search/recommendations/.get.parameters[].description
Number of similar items to retrieve via RAG per tenant (before filtering). Higher values give more options but may be slower.

# paths./api/ai-search/recommendations/.get.parameters[].description
Number of course recommendations to return (max 20)

# paths./api/ai-search/recommendations/.get.parameters[].description
Page number for pagination (starts at 1)

# paths./api/ai-search/recommendations/.get.parameters[].description
Number of recommendations per page (max 100)

# paths./api/ai-search/recommendations/.get.parameters[].description
Platform key for tenant-scoped recommendations

# paths./api/ai-search/recommendations/.get.parameters[].description
Platform org identifier (optional - avoids database lookup if provided)

# paths./api/ai-search/recommendations/.get.parameters[].description
Custom prompt for LLM ranking (only if ranking_strategy='custom'). Define how the LLM should evaluate and order the recommendations.

# paths./api/ai-search/recommendations/.get.parameters[].description
Strategy for LLM ranking. Only used if use_llm_ranking=True.

* `relevance` - Rank by relevance and value (default)
* `difficulty` - Rank by difficulty progression
* `personalized` - Personalize to user context and goals
* `custom` - Use custom ranking prompt

# paths./api/ai-search/recommendations/.get.parameters[].description
Type of resource to recommend. Catalog types (courses/programs/resources/pathways) will use the platform's 'catalog' prompt category if configured.

* `mentors` - Mentor Recommendations
* `courses` - Course Recommendations
* `programs` - Program Recommendations
* `resources` - Resource Recommendations
* `pathways` - Pathway Recommendations

# paths./api/ai-search/recommendations/.get.parameters[].description
Search terms to find similar content (e.g., 'leadership', 'data science'). Used to build the RAG query.

# paths./api/ai-search/recommendations/.get.parameters[].description
Frontend/SPA identifier (e.g., 'catalog.example.com', 'mentor-ai.ibl.com'). Used to retrieve the correct prompt for that specific frontend. Auto-detected from HTTP_REFERER if not provided.

# paths./api/ai-search/recommendations/.get.parameters[].description
What triggered this recommendation request

# paths./api/ai-search/recommendations/.get.parameters[].description
Use LLM to rank and personalize RAG results. Adds AI-generated reasoning but increases cost and latency. Only applies if use_rag_search=True.

# paths./api/ai-search/recommendations/.get.parameters[].description
Use RAG similarity search instead of full LLM catalog review. Faster and more cost-effective. Set to False for legacy LLM-only behavior.

# paths./api/ai-search/recommendations/.get.responses.200.content.application/json.examples.BasicRecommendationRequest.description
Request 5 course recommendations for authenticated user

# paths./api/ai-search/recommendations/.get.responses.200.content.application/json.examples.Post-assessmentRecommendation.description
Request recommendations after completing an assessment

# paths./api/ai-search/recommendations/.get.responses.400.description
Bad request - invalid parameters or missing required fields

# paths./api/ai-search/sellable-items/.get.description
Search across courses, programs, pathways, and mentors on a platform to find items a seller can monetise. Requires authentication and the Ibl.Billing/CanSellItems RBAC policy.

# paths./api/ai-search/sellable-items/.get.summary
Search for items that can be put up for sale

# paths./api/ai-search/sellable-items/.get.parameters[].description
Filter by item type (CSV): course, program, pathway, mentor.

# paths./api/ai-search/sellable-items/.get.parameters[].description
Field to sort results by.

* `name` - name
* `created_at` - created_at

# paths./api/ai-search/sellable-items/.get.parameters[].description
Sort direction.

* `asc` - asc
* `desc` - desc

# paths./api/ai-search/sellable-items/.get.parameters[].description
Filter by paywall status: 'none' (no paywall configured), 'enabled' (paywall active), 'disabled' (paywall exists but inactive).

* `none` - none
* `enabled` - enabled
* `disabled` - disabled

# paths./api/ai-search/sellable-items/.get.parameters[].description
Platform key (required). Items are scoped to a platform.

# paths./api/ai-search/sellable-items/.get.parameters[].description
Free-text search across item name and description.

# paths./api/analytics/content/.get.description
        Retrieve aggregated analytics for catalog content (courses, programs, pathways, skills).
        
        Returns both summary statistics and paginated list of content items with individual analytics.
        When a platform_key is provided, results are filtered to show only content consumed by 
        learners associated with that platform.
        
        **RBAC Requirements:**
        - Requires: Analytics Viewer role (Ibl.Analytics/Core/read) or Tenant Admin role (Ibl.*)
        
        **Metrics supported:**
        - `course` or `courses`: Course analytics with time spent
        - `program` or `programs`: Program analytics  
        - `pathway` or `pathways`: Pathway analytics
        - `skill` or `skills`: Skill analytics
        
        **Platform Filtering:**
        - Without platform_key: Shows global analytics across all platforms
        - With platform_key: Shows analytics filtered by platform learners only
        
        **Time Spent Analytics:**
        - Platform-level: Total time spent across all content and average per learner
        - Course-level: Total time spent per course and average per enrolled learner
        - Time values are provided in seconds for precision
        - Overtime: Time series data showing platform time spent over last 7 days (courses only, and include_overtime=true)
        
        **External Content:**
        - Content not owned by the requesting platform but used by its learners is marked as "external"
        - External content has limited metadata exposure for privacy
        

# paths./api/analytics/content/.get.parameters[].description
* `today` - Today only
* `7d` - Last 7 days
* `30d` - Last 30 days
* `90d` - Last 90 days
* `all_time` - All time
* `custom` - Custom date range

# paths./api/analytics/content/.get.parameters[].description
* `day` - day
* `hour` - hour
* `week` - week
* `month` - month

# paths./api/analytics/content/.get.parameters[].description
The type of content to retrieve (course, program, pathway, skill)

* `course` - course
* `courses` - courses
* `program` - program
* `programs` - programs
* `pathway` - pathway
* `pathways` - pathways
* `skill` - skill
* `skills` - skills

# paths./api/analytics/content/.get.parameters[].description
Optional platform key to filter results by platform

# paths./api/analytics/content/.get.parameters[].description
Optional list of usergroup IDs to filter results

# paths./api/analytics/content/details/{content_id}/.get.description
Retrieve detailed analytics for a specific content item including summary statistics, learner-level data, and optional time series information.

# paths./api/analytics/content/details/{content_id}/.get.parameters[].description
* `today` - Today only
* `7d` - Last 7 days
* `30d` - Last 30 days
* `90d` - Last 90 days
* `all_time` - All time
* `custom` - Custom date range

# paths./api/analytics/content/details/{content_id}/.get.parameters[].description
Content type to fetch (course, program, pathway, skill)

* `course` - course
* `courses` - courses
* `program` - program
* `programs` - programs
* `pathway` - pathway
* `pathways` - pathways
* `skill` - skill
* `skills` - skills

# paths./api/analytics/content/details/{content_id}/.get.parameters[].description
Optional time series metric (enrollments, completions, ratings, time_spent)

# paths./api/analytics/content/details/{content_id}/.get.parameters[].description
Optional list of usergroup IDs to filter results

# paths./api/analytics/conversations/.get.description
Mixin for RBAC validation for mentor analytics views.

Mentor analytics endpoints enforce RBAC in two phases:
1. Endpoint authorization (_perform_mentor_analytics_validation):
   - Aggregate (no mentor_unique_id): requires
     "Ibl.Analytics/CanViewAnalytics/action" on /platforms/{pk}/ AND
     "Ibl.Analytics/Mentors/read" on /platforms/{pk}/mentors/.
   - Per-mentor (mentor_unique_id provided): requires
     "Ibl.Analytics/CanViewMentorAnalytics/action" on
     /platforms/{pk}/mentors/{mentor_id}/. The mentor-owner bypass
     (is_owner) applies via the MENTOR_OWNER well-known role.
2. Row-level filter (_get_accessible_user_ids_for_mentor_analytics):
   - Enumerates accessible users under
     /platforms/{pk}/mentors/{mentor_id}/users/ using
     "Ibl.Analytics/Mentors/read". Grants on the mentor resource itself
     cascade to its users (full mentor access). Usergroup authorization
     is resolved at platform-level (/platforms/{pk}/usergroups/) —
     mentor-level grants do NOT cascade to usergroup access.

Special case - Mentor owner unfiltered access:
If the requesting user owns the mentor AND no usergroup_ids are
specified, returns None (no filtering) — the analytics query layer is
already scoped to the mentor. With usergroup_ids provided, the owner
falls through to normal RBAC filtering and still needs explicit access
(ownership or grant) to the requested groups.

Note: Mentor analytics APIs work with platform_key (from query params).

# paths./api/analytics/conversations/.get.parameters[].description
* `today` - Today only
* `7d` - Last 7 days
* `30d` - Last 30 days
* `90d` - Last 90 days
* `all_time` - All time
* `custom` - Custom date range

# paths./api/analytics/conversations/.get.parameters[].description
* `day` - day
* `hour` - hour
* `week` - week
* `month` - month

# paths./api/analytics/conversations/.get.parameters[].description
* `conversations` - Conversations over time
* `headline` - Headline metrics for conversations (avg messages per conversation, avg rating)

# paths./api/analytics/conversations/.get.parameters[].description
Optional list of usergroup IDs to filter results

# paths./api/analytics/financial/.get.description
Financial Analytics API - Get comprehensive cost metrics with comparison analysis.

This endpoint provides period-based cost analysis (not cumulative) with support for:
- Multiple time granularities and metrics
- Cross-dimensional filtering
- Percentage change vs comparison periods
- Forward-filled time series

**Examples:**

**Basic Weekly Costs:**
```
GET /api/analytics/financial/?metric=weekly_costs&comparison_days=10
```

**Platform & Mentor Filtered:**
```
# Get total costs for a specific platform and mentor
GET /api/analytics/financial/?metric=total_costs&platform_key=web-app&mentor_unique_id=mentor-123&comparison_days=14
```

**Monthly Costs by Provider:**
```
GET /api/analytics/financial/?metric=monthly_costs&provider=openai&granularity=month&comparison_days=30
```

**Daily Costs for Specific User:**
```
GET /api/analytics/financial/?metric=total_costs&username=user-456&granularity=day&start_date=2025-01-15&end_date=2025-01-21&comparison_days=7
```


**Response Structure:**
```json
{
    "metric": "weekly_costs",
    "value": 12.47,
    "percentage_change": 8.5,
    "overtime": [
        {"date": "2025-01-06", "value": 2.89},
        {"date": "2025-01-13", "value": 3.12}
    ],
    "period_info": {
        "start_date": "2025-01-01",
        "end_date": "2025-01-31",
        "period_days": 31
    },
    "comparison_info": {
        "previous_period_value": 11.50,
        ...
    }
}
```

# paths./api/analytics/financial/.get.parameters[].description
Number of days for comparison period to calculate percentage change (e.g., 10 for 10-day comparison)

# paths./api/analytics/financial/.get.parameters[].description
* `today` - Today only
* `7d` - Last 7 days
* `30d` - Last 30 days
* `90d` - Last 90 days
* `all_time` - All time
* `custom` - Custom date range

# paths./api/analytics/financial/.get.parameters[].description
Method for filling missing time periods in overtime data

* `zero` - Fill missing periods with zero
* `previous` - Fill missing periods with previous value

# paths./api/analytics/financial/.get.parameters[].description
Time granularity for overtime series data

* `day` - Daily data points
* `week` - Weekly data points
* `month` - Monthly data points

# paths./api/analytics/financial/.get.parameters[].description
Filter by specific LLM model (e.g., gpt-4o, claude-3-5-sonnet)

# paths./api/analytics/financial/.get.parameters[].description
Type of financial metric to retrieve

* `total_costs` - Total costs for selected timeframe
* `weekly_costs` - Costs for current/selected week
* `monthly_costs` - Costs for current/selected month

# paths./api/analytics/financial/.get.parameters[].description
Filter by AI provider

* `openai` - OpenAI
* `anthropic` - Anthropic
* `azure` - Azure
* `google` - Google
* `meta` - Meta
* `other` - Other

# paths./api/analytics/financial/.get.parameters[].description
Whether to include overtime series data in response

# paths./api/analytics/financial/.get.parameters[].description
Optional list of usergroup IDs to filter results

# paths./api/analytics/financial/.get.parameters[].description
Filter by specific username - returns costs for this user only

# paths./api/analytics/financial/.get.responses.200.description
Successful financial metrics response with period-based cost data

# paths./api/analytics/financial/details/.get.description
Financial Details Analytics API – paginated cost tables with flexible grouping.

This endpoint returns tabular cost metrics aggregated by the dimension
specified via the `group_by` query parameter.  One or more KPI columns
can be requested through the comma-separated `metrics` list while
typical filters (date range, provider, platform_key, user, etc.) narrow the
dataset.  Results are paginated with `page` / `limit`.

**Required query parameters**
- group_by – provider | llm_model | username | mentor | platform
- metrics – csv list of KPI names, e.g. total_cost, sessions

**Shared optional filters**
- start_date, end_date   – ISO yyyy-mm-dd (ignored when all_time=true)
- platform_key           – tenant isolation
- mentor_unique_id       – filter to one mentor
- username               – filter to a learner
- provider / llm_model   – filter to LLM provider / model
- all_time               – true → lifetime totals
- page (default 1), limit (default 50)

**Examples**
--------
1. Cost by provider for the last week
```
   GET /api/v2/analytics/financial/details?
       group_by=provider&
       metrics=total_cost&
       start_date=2025-01-01&
       end_date=2025-01-07&
       page=1&limit=10
```

2. Lifetime cost per user with extra KPIs
   ```
   GET /api/v2/analytics/financial/details?
       group_by=username&
       metrics=total_cost,sessions&
       all_time=true&page=1&limit=50
   ```
3. Cost by LLM model with tenant filter
```
   GET /api/v2/analytics/financial/details?
       group_by=llm_model&
       metrics=total_cost&
       platform_key=web-app&
       start_date=2025-01-01&end_date=2025-01-31
```
Response structure
-------------------
```
{
  "page": 1,
  "limit": 10,
  "total_pages": 1,
  "total_records": 3,
  "rows": [
    {"provider": "openai", "total_cost": "2.50000"},
    {"provider": "anthropic", "total_cost": "1.00000"},
    {"provider": "azure",    "total_cost": "0.50000"}
  ],
  "metrics": [
    {
      "name": "total_cost",
      "unit": "$",
      "description": "Cost for this entity in period"
    }
  ],
  "total_cost": "4.00000"   // optional grand-total when available
}
``

# paths./api/analytics/financial/details/.get.parameters[].description
* `today` - Today only
* `7d` - Last 7 days
* `30d` - Last 30 days
* `90d` - Last 90 days
* `all_time` - All time
* `custom` - Custom date range

# paths./api/analytics/financial/details/.get.parameters[].description
Dimension to group by

* `provider` - Group by provider
* `llm_model` - Group by LLM model
* `username` - Group by username
* `mentor` - Group by mentor
* `platform` - Group by platform
* `action` - Group by actions

# paths./api/analytics/financial/details/.get.parameters[].description
Comma-separated list of metrics (e.g. total_cost,sessions, last_active)

# paths./api/analytics/financial/details/.get.parameters[].description
Optional list of usergroup IDs to filter results

# paths./api/analytics/financial/invoice/.get.description
Flexible Invoice Report API – Billing summary with username and platform filtering.

This endpoint generates invoice reports with flexible filtering options:
- Platform admins can view their platform's data and filter by username within their platform
- Super admins can view any combination of username/platform or global summaries

**Key Features:**
- Flexible filtering by username and/or platform_key
- Essential metrics: total cost, sessions, usage period
- Provider breakdown (OpenAI, Anthropic, etc.)
- Top mentors/actions by cost
- Clean, invoice-ready format

**Query Parameters:**
- username: Filter by specific username (optional)
- platform_key: Filter by platform (optional, but required for platform admins)
- start_date, end_date: billing period (defaults to last 30 days)
- include_breakdown: show provider/mentor details (default: true)

**Permission Logic:**
- Platform admins: Must include platform_key matching their permission scope
- Super admins: Can use any combination of filters or none (global summary)

**Examples:**
```
# Platform admin viewing their platform
GET /api/analytics/financial/invoice?platform_key=web-app

# Platform admin viewing specific user in their platform
GET /api/analytics/financial/invoice?platform_key=web-app&username=john.doe

# Super admin viewing specific user across all platforms
GET /api/analytics/financial/invoice?username=john.doe

# Super admin viewing global summary
GET /api/analytics/financial/invoice
```

**Response Structure:**
```json
{
  "entity": {
    "type": "user|platform|global",
    "username": "john.doe",
    "platform_key": "web-app",
    "platform_name": "Web Application",
    "display_name": "John Doe on Web Application"
  },
  "billing_period": {
    "start_date": "2025-01-01",
    "end_date": "2025-01-31",
    "days": 31
  },
  "summary": {
    "total_cost": 245.750,
    "total_sessions": 1250,
    "active_users": 85,
    "cost_per_session": 0.196
  },
  "breakdown": {
    "by_provider": [...],
    "by_mentor": [...],
    "by_action": [...]
  }
}
```

# paths./api/analytics/financial/invoice/.get.parameters[].description
End date for billing period (defaults to today)

# paths./api/analytics/financial/invoice/.get.parameters[].description
Whether to include provider and mentor breakdown

# paths./api/analytics/financial/invoice/.get.parameters[].description
Platform key to filter by (optional, required for platform admins)

# paths./api/analytics/financial/invoice/.get.parameters[].description
Start date for billing period (defaults to 30 days ago)

# paths./api/analytics/financial/invoice/.get.parameters[].description
Optional list of usergroup IDs to filter results

# paths./api/analytics/financial/invoice/.get.parameters[].description
Username to generate invoice for (optional)

# paths./api/analytics/learner/details.get.description
        Retrieve a holistic snapshot of a learner across catalog enrollments, mentor
        engagement, skills, credentials, and time spent data. The `metrics` query parameter controls
        which sections are returned and defaults to `courses` when omitted.

        Optional `course_id` / `program_id` / `pathway_id` scope the matching section to a
        single item (empty list if the learner is not enrolled — never a 404); omitting them
        returns the full list unchanged. When `course_id` is set, the course block is also
        enriched with the learner's live edX Progress data under `edx_progress` (completion
        summary, grade, grade summary) unless `include_edx_progress=false`. The edX call is
        best-effort: on failure `edx_progress` is null and the DM data is still returned.
        `program_id` / `pathway_id` get scoping only — no edX enrichment.
        

# paths./api/analytics/learner/details.get.parameters[].description
Scope the `courses` and `time_spent` sections to a single course. When set, also enriches the course with live edX progress (see `include_edx_progress`).

# paths./api/analytics/learner/details.get.parameters[].description
* `today` - Today only
* `7d` - Last 7 days
* `30d` - Last 30 days
* `90d` - Last 90 days
* `all_time` - All time
* `custom` - Custom date range

# paths./api/analytics/learner/details.get.parameters[].description
* `day` - day
* `hour` - hour
* `week` - week
* `month` - month

# paths./api/analytics/learner/details.get.parameters[].description
When `course_id` is set, fold the learner's live edX Progress-page data (completion summary, grade, grade summary) into the course block. Defaults to true; set false to skip the edX round-trip.

# paths./api/analytics/learner/details.get.parameters[].description
Include overtime metrics for time_spent data (default: false)

# paths./api/analytics/learner/details.get.parameters[].description
Scope the `pathways` section to a single pathway.

# paths./api/analytics/learner/details.get.parameters[].description
Scope the `programs` section to a single program.

# paths./api/analytics/learner/details.get.parameters[].description
Optional list of usergroup IDs to filter results

# paths./api/analytics/learner/details.get.responses.200.description
Learner profile with requested analytics data

# paths./api/analytics/learner/details.get.responses.400.description
Bad Request - Invalid parameters supplied

# paths./api/analytics/learners/.get.description
Unified API endpoint for learner analytics.

This endpoint provides either:
1. Cross-platform summary (when only username is provided)
2. Platform-specific detailed data (when username + platform_key are provided)

Query params:
- username (required): Username of the learner
- platform_key (optional): Platform key for platform-specific data
- page (optional): Page number (default: 1)
- limit (optional): Records per page (default: 20, max: 100)

Returns:
- If platform_key provided: Detailed platform metrics
- If no platform_key: Cross-platform summary with pagination

# paths./api/analytics/learners/.get.parameters[].description
* `today` - Today only
* `7d` - Last 7 days
* `30d` - Last 30 days
* `90d` - Last 90 days
* `all_time` - All time
* `custom` - Custom date range

# paths./api/analytics/learners/.get.parameters[].description
* `day` - day
* `hour` - hour
* `week` - week
* `month` - month

# paths./api/analytics/learners/.get.parameters[].description
Number of records per page (default: 20, max: 100)

# paths./api/analytics/learners/.get.parameters[].description
Include overtime metrics for the user in the platform (default: false)

# paths./api/analytics/learners/.get.parameters[].description
Optional platform key - if provided, returns platform-specific detailed data

# paths./api/analytics/learners/.get.parameters[].description
Optional list of usergroup IDs to filter results

# paths./api/analytics/learners/.get.parameters[].description
Username of the learner to get analytics for. Defaults to self if not provided.

# paths./api/analytics/learners/list/.get.description
        Retrieve a paginated list of learners for a specific platform with their comprehensive
        metrics from the UserPlatformSummary materialized view. This endpoint is accessible only
        to platform administrators and supports search, sorting, and pagination.
        

# paths./api/analytics/learners/list/.get.parameters[].description
* `today` - Today only
* `7d` - Last 7 days
* `30d` - Last 30 days
* `90d` - Last 90 days
* `all_time` - All time
* `custom` - Custom date range

# paths./api/analytics/learners/list/.get.parameters[].description
* `day` - day
* `hour` - hour
* `week` - week
* `month` - month

# paths./api/analytics/learners/list/.get.parameters[].description
Number of learners per page (default: 20, max: 100)

# paths./api/analytics/learners/list/.get.parameters[].description
Platform key to filter learners by platform

# paths./api/analytics/learners/list/.get.parameters[].description
Search term to filter learners by username, email, or name

# paths./api/analytics/learners/list/.get.parameters[].description
Field to sort learners by (default: last_activity)

* `username` - Username
* `name` - Name
* `last_activity` - Last Activity
* `total_points` - Total Points
* `total_time_spent_seconds` - Time Spent
* `total_enrollments` - Enrollments
* `total_skills_count` - Skills Count

# paths./api/analytics/learners/list/.get.parameters[].description
Sort order (default: desc)

* `asc` - Ascending
* `desc` - Descending

# paths./api/analytics/learners/list/.get.parameters[].description
Optional list of usergroup IDs to filter results

# paths./api/analytics/learners/list/.get.responses.200.description
Paginated list of learners with their metrics

# paths./api/analytics/learners/list/.get.responses.400.description
Bad Request - Invalid parameters supplied

# paths./api/analytics/learners/list/.get.responses.403.description
Forbidden - Platform admin access required

# paths./api/analytics/messages/.get.description
Conversation list endpoint for analytics.

Query params (all optional unless specified by permissions):
- platform_key: filter by platform
- mentor_unique_id: filter by mentor
- page: page number (default 1)
- limit: page size (default 20, max 100)
- search: search in user name and first user message
- min_messages, max_messages: message_count range
- sentiment: positive|negative|neutral
- topic: topic name contains
- start_date, end_date: date filter on conversation date

Returns: summary totals, results list (paginated), and pagination metadata.

# paths./api/analytics/messages/.get.parameters[].description
* `positive` - positive
* `negative` - negative
* `neutral` - neutral

# paths./api/analytics/messages/.get.parameters[].description
Optional list of usergroup IDs to filter results

# paths./api/analytics/messages/details/.get.description
Conversation detail endpoint for analytics.

Query params:
- session_id (required): UUID of the session to fetch
- platform_key, mentor_unique_id (optional): further scope
- start_date, end_date (optional): date filter on message timestamps

Returns: summary metadata from conversation_list MV, and a list of
human/ai message pairs in chronological order.

# paths./api/analytics/messages/details/.get.parameters[].description
Optional list of usergroup IDs to filter results

# paths./api/analytics/orgs/{org}/time/update/.post.description
Update time spent tracking data from client-side events.

This endpoint receives time spent data collected on the client side and
stores it in the analytics database. Authentication is optional - the API
supports both authenticated and anonymous requests.

Methods:
    POST: Submit time spent tracking data

Authentication:
    Optional - supports both authenticated and anonymous requests.
    - Authenticated requests: User ID is associated with the record
    - Anonymous requests: Records are stored with null user_id

Returns:
    A response indicating success or failure:
    {
        "success": true|false,
        "message": "Error message if failed" (optional)
    }

Error Responses:
    400 Bad Request: If the request data is invalid or the API is disabled

Notes:
    This API must be enabled via the ENABLE_TIME_SPENT_UPDATE_API setting.

# paths./api/analytics/ratings/.get.description
Ratings overtime endpoint.

Query params:
- metric: only 'ratings' is supported (default)
- platform_key, mentor_unique_id: optional filters
- granularity: 'day' (default) or 'hour' (hour only for today)
- start_date, end_date: optional date range; defaults applied if not provided

Returns: { metric: 'ratings', points: [{date, value}, ...] }

# paths./api/analytics/ratings/.get.parameters[].description
* `today` - Today only
* `7d` - Last 7 days
* `30d` - Last 30 days
* `90d` - Last 90 days
* `all_time` - All time
* `custom` - Custom date range

# paths./api/analytics/ratings/.get.parameters[].description
* `day` - day
* `hour` - hour
* `week` - week
* `month` - month

# paths./api/analytics/ratings/.get.parameters[].description
Optional list of usergroup IDs to filter results

# paths./api/analytics/sessions/.get.description
Mixin for RBAC validation for mentor analytics views.

Mentor analytics endpoints enforce RBAC in two phases:
1. Endpoint authorization (_perform_mentor_analytics_validation):
   - Aggregate (no mentor_unique_id): requires
     "Ibl.Analytics/CanViewAnalytics/action" on /platforms/{pk}/ AND
     "Ibl.Analytics/Mentors/read" on /platforms/{pk}/mentors/.
   - Per-mentor (mentor_unique_id provided): requires
     "Ibl.Analytics/CanViewMentorAnalytics/action" on
     /platforms/{pk}/mentors/{mentor_id}/. The mentor-owner bypass
     (is_owner) applies via the MENTOR_OWNER well-known role.
2. Row-level filter (_get_accessible_user_ids_for_mentor_analytics):
   - Enumerates accessible users under
     /platforms/{pk}/mentors/{mentor_id}/users/ using
     "Ibl.Analytics/Mentors/read". Grants on the mentor resource itself
     cascade to its users (full mentor access). Usergroup authorization
     is resolved at platform-level (/platforms/{pk}/usergroups/) —
     mentor-level grants do NOT cascade to usergroup access.

Special case - Mentor owner unfiltered access:
If the requesting user owns the mentor AND no usergroup_ids are
specified, returns None (no filtering) — the analytics query layer is
already scoped to the mentor. With usergroup_ids provided, the owner
falls through to normal RBAC filtering and still needs explicit access
(ownership or grant) to the requested groups.

Note: Mentor analytics APIs work with platform_key (from query params).

# paths./api/analytics/sessions/.get.parameters[].description
* `today` - Today only
* `7d` - Last 7 days
* `30d` - Last 30 days
* `90d` - Last 90 days
* `all_time` - All time
* `custom` - Custom date range

# paths./api/analytics/sessions/.get.parameters[].description
* `day` - day
* `hour` - hour
* `week` - week
* `month` - month

# paths./api/analytics/sessions/.get.parameters[].description
* `sessions` - Sessions over time
* `headline` - Headline metrics for sessions (avg messages per session, avg rating)

# paths./api/analytics/sessions/.get.parameters[].description
Optional list of usergroup IDs to filter results

# paths./api/analytics/time/.get.description
        Time Analytics API - User activity patterns by time of day and day of week.
        
        Provides heatmap data showing when users are most active, useful for:
        - Understanding peak usage times
        - Capacity planning and resource allocation
        - User behavior analysis
        - Support scheduling optimization
        
        **Key Features:**
        - Day of week patterns (0=Sunday through 6=Saturday)
        - Hour of day activity levels (0-23)
        - Flexible date range filtering
        - Platform and mentor-specific filtering
        - Message count aggregation
        
        **Data Structure:**
        - `day_of_week`: 0-6 (Sunday-Saturday)
        - `hour`: 0-23 (24-hour format)
        - `value`: Message count for that time slot
        

# paths./api/analytics/time/.get.parameters[].description
* `today` - Today only
* `7d` - Last 7 days
* `30d` - Last 30 days
* `90d` - Last 90 days
* `all_time` - All time
* `custom` - Custom date range

# paths./api/analytics/time/.get.parameters[].description
* `day` - day
* `hour` - hour
* `week` - week
* `month` - month

# paths./api/analytics/time/.get.parameters[].description
Optional list of usergroup IDs to filter results

# paths./api/analytics/time/.get.responses.200.content.application/json.examples.AccessTimesHeatmap.description
Hourly activity patterns by day of week (0=Sunday, 1=Monday, etc.)

# paths./api/analytics/time/.get.responses.200.description
Access times heatmap data with day/hour patterns

# paths./api/analytics/time-spent/user/.get.description
        Returns the total time spent (in seconds) for the current authenticated user.
        Can be filtered by platform, date range, course ID, URL, mentor UUID, and session UUID.
        

# paths./api/analytics/time-spent/user/.get.parameters[].description
Username to get data for (admin users only)

# paths./api/analytics/topics/.get.description
Returns topics overview analytics for a given platform and mentor.

Permission Required:
- Platform Admin
- Ibl.Analytics/Mentors/read

# paths./api/analytics/topics/.get.parameters[].description
* `today` - Today only
* `7d` - Last 7 days
* `30d` - Last 30 days
* `90d` - Last 90 days
* `all_time` - All time
* `custom` - Custom date range

# paths./api/analytics/topics/.get.parameters[].description
* `day` - day
* `hour` - hour
* `week` - week
* `month` - month

# paths./api/analytics/topics/.get.parameters[].description
* `overview` - Overall topic metrics
* `sessions` - Sessions over time
* `ratings` - Ratings over time
* `highlighted` - Highlighted topics

# paths./api/analytics/topics/.get.parameters[].description
Optional list of usergroup IDs to filter results

# paths./api/analytics/topics/details/.get.description
Returns topic details Analytics for a given platform and mentor.

Permission Required:
- Platform Admin
- Ibl.Analytics/Mentors/read

# paths./api/analytics/topics/details/.get.parameters[].description
* `today` - Today only
* `7d` - Last 7 days
* `30d` - Last 30 days
* `90d` - Last 90 days
* `all_time` - All time
* `custom` - Custom date range

# paths./api/analytics/topics/details/.get.parameters[].description
Optional list of usergroup IDs to filter results

# paths./api/analytics/users/.get.description
        User Analytics API - Comprehensive user activity metrics and trends.
        
        Provides real-time and historical user analytics including:
        - Currently active users (last hour)
        - Active users over time periods (7d, 30d, 90d)
        - Registered user counts and growth
        - Time series charts with customizable granularity
        
        **Key Features:**
        - Real-time active user counting
        - Percentage change calculations vs previous periods
        - Flexible date filtering and granularity
        - Platform and mentor-specific filtering
        - Forward-filled time series data
        
        **Supported Metrics:**
        - `currently_active`: Users active in last hour
        - `active_users`: Unique users in specified period
        - `registered_users`: Total and new user counts
        

# paths./api/analytics/users/.get.parameters[].description
* `today` - Today only
* `7d` - Last 7 days
* `30d` - Last 30 days
* `90d` - Last 90 days
* `all_time` - All time
* `custom` - Custom date range

# paths./api/analytics/users/.get.parameters[].description
* `day` - day
* `hour` - hour
* `week` - week
* `month` - month

# paths./api/analytics/users/.get.parameters[].description
* `currently_active` - Users logged in right now
* `active_users` - Active users in a period
* `registered_users` - Registered users
* `active_users_last_30d` - Active users in the last 30 days

# paths./api/analytics/users/.get.parameters[].description
Optional list of usergroup IDs to filter results

# paths./api/analytics/users/.get.responses.200.content.application/json.examples.ActiveUsers30Days.description
Unique active users in the last 30 days with comparison

# paths./api/analytics/users/.get.responses.200.content.application/json.examples.RegisteredUsers.description
Total registered users and new users this month

# paths./api/analytics/users/.get.responses.200.content.application/json.examples.ActiveUsersChart.description
Time series of active users with forward-filled gaps

# paths./api/analytics/users/.get.responses.200.description
User analytics metrics with comparison data

# paths./api/analytics/users/details/.get.description
        User Details API - Comprehensive user activity details with search and filtering.
        
        Provides detailed user information including:
        - User contact information (email, full name)
        - Activity metrics (message count, last activity)
        - Search functionality across multiple fields
        - Flexible date range filtering
        - CSV export capability
        
        **Key Features:**
        - Full-text search across email, name, and user ID
        - Date range filtering for activity periods
        - Platform and mentor-specific filtering
        - Comprehensive pagination with metadata
        - CSV export for data analysis
        - User aggregation across platforms/mentors
        
        **Search Capabilities:**
        - Email address matching
        - Full name search
        - User ID lookup
        - Partial string matching (case-insensitive)
        
        **Export Options:**
        - JSON response (default)
        - CSV export (?export=csv)
        - Includes all user fields in export
        

# paths./api/analytics/users/details/.get.parameters[].description
* `today` - Today only
* `7d` - Last 7 days
* `30d` - Last 30 days
* `90d` - Last 90 days
* `all_time` - All time
* `custom` - Custom date range

# paths./api/analytics/users/details/.get.parameters[].description
Optional list of usergroup IDs to filter results

# paths./api/analytics/users/details/.get.responses.200.content.application/json.examples.UserDetailsResponse.description
Paginated list of users with activity details

# paths./api/analytics/users/details/.get.responses.200.content.application/json.examples.CSVExport.description
CSV export format when ?export=csv is specified

# paths./api/analytics/users/details/.get.responses.200.description
Paginated user details with activity metrics

# paths./api/audience/orgs/{org}/active-users/over-time.get.description
Get active user counts over time.

This endpoint provides daily counts of active users (users with known activity)
over a specified time period.

Query Parameters:
    start_date (str, optional): Start date for the time range (ISO format)
    end_date (str, optional): End date for the time range (ISO format)

Returns:
    Daily active user counts over the specified time period, with change metrics
    compared to previous periods.

Default time range is the last 7 days if no dates are specified.

An active user is defined as a user with any activity within the past 30 days.

# paths./api/audience/orgs/{org}/active-users/over-time.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/audience/orgs/{org}/active-users/per-course.get.description
Get active user counts on a per-course basis.

This endpoint provides counts of active users for each course within
the specified date range.

Query Parameters:
    start_date (str, optional): Start date for filtering (ISO format)
    end_date (str, optional): End date for filtering (ISO format)

Returns:
    A list of courses with their active user counts.

Default time range is the last 7 days if no dates are specified.

# paths./api/audience/orgs/{org}/active-users/per-course.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/audience/orgs/{org}/active-users/users.get.description
Get a list of active users with activity metrics.

This endpoint provides a paginated list of users who have had activity
within the specified date range.

Query Parameters:
    start_date (str, optional): Start date for filtering (ISO format)
    end_date (str, optional): End date for filtering (ISO format)
    course_id (str, optional): Filter by course ID
    page (int, optional): Page number for pagination
    length (int, optional): Number of items per page

Returns:
    A paginated list of active users with their activity metrics.

Default time range is the last 7 days if no dates are specified.

# paths./api/audience/orgs/{org}/active-users/users.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/audience/orgs/{org}/enrollments/courses/{course_id}/over-ti.get.description
Get enrollment or unenrollment counts over time.

This endpoint provides daily counts of new enrollments or unenrollments
over a specified time period.

Query Parameters:
    start_date (str, optional): Start date for the time range (ISO format)
    end_date (str, optional): End date for the time range (ISO format)
    course_id (str, optional): Filter by course ID
    active (bool): Get enrollments when true, unenrollments when false

Returns:
    Daily counts over the specified time period, with change metrics
    compared to previous periods.

Default time range is the last 7 days if no dates are specified.

# paths./api/audience/orgs/{org}/enrollments/courses/{course_id}/over-ti.get.parameters[].description
Any of `y`, `yes`, `true`. set to false or no for unenrollments 

* `y` - y
* `yes` - yes
* `true` - true
* `True` - True
* `n` - n
* `no` - no
* `false` - false
* `False` - False

# paths./api/audience/orgs/{org}/enrollments/courses/{course_id}/over-ti.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/audience/orgs/{org}/enrollments/courses/{course_id}/users.get.description
List users enrolled in a specific course.

This endpoint provides a list of users who are enrolled or unenrolled
in a specified course.

Query Parameters:
    course_id (str): The course ID to get enrollments for
    active (bool): Filter for active enrollments when true, inactive when false
    page (int, optional): Page number for pagination
    length (int, optional): Number of items per page

Returns:
    A paginated list of users with:
    - Username
    - Full name
    - Email
    - Enrollment timestamp

# paths./api/audience/orgs/{org}/enrollments/courses/{course_id}/users.get.parameters[].description
Any of `y`, `yes`, `true`. set to false or no for unenrollments 

* `y` - y
* `yes` - yes
* `true` - true
* `True` - True
* `n` - n
* `no` - no
* `false` - false
* `False` - False

# paths./api/audience/orgs/{org}/enrollments/courses/{course_id}/users.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/audience/orgs/{org}/enrollments/over-time.get.description
Get enrollment or unenrollment counts over time.

This endpoint provides daily counts of new enrollments or unenrollments
over a specified time period.

Query Parameters:
    start_date (str, optional): Start date for the time range (ISO format)
    end_date (str, optional): End date for the time range (ISO format)
    course_id (str, optional): Filter by course ID
    active (bool): Get enrollments when true, unenrollments when false

Returns:
    Daily counts over the specified time period, with change metrics
    compared to previous periods.

Default time range is the last 7 days if no dates are specified.

# paths./api/audience/orgs/{org}/enrollments/over-time.get.parameters[].description
Any of `y`, `yes`, `true`. set to false or no for unenrollments 

* `y` - y
* `yes` - yes
* `true` - true
* `True` - True
* `n` - n
* `no` - no
* `false` - false
* `False` - False

# paths./api/audience/orgs/{org}/enrollments/over-time.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/audience/orgs/{org}/enrollments/per-course.get.description
List enrollment statistics on a per-course basis.

This endpoint provides enrollment counts for all courses, with options
to filter for active or inactive enrollments and to include time-based data.

Query Parameters:
    active (bool): Filter for active enrollments when true, inactive when false
    start_date (str, optional): Start date for time-based filtering (ISO format)
    end_date (str, optional): End date for time-based filtering (ISO format)
    page (int, optional): Page number for pagination
    length (int, optional): Number of items per page

Returns:
    A paginated list of courses with their enrollment counts and percentages.

# paths./api/audience/orgs/{org}/enrollments/per-course.get.parameters[].description
Any of `y`, `yes`, `true`. set to false or no for unenrollments 

* `y` - y
* `yes` - yes
* `true` - true
* `True` - True
* `n` - n
* `no` - no
* `false` - false
* `False` - False

# paths./api/audience/orgs/{org}/enrollments/per-course.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/audience/orgs/{org}/registered-users/.get.description
List all learners on the platform with aggregated metrics.

This endpoint returns a paginated list of all learners with key metrics including:
- Enrollment counts
- Completion counts
- Time spent on platform

Query Parameters:
    page (int): Page number for pagination
    length (int): Number of items per page
    search (str): Filter learners by username, email, or name

Returns:
    A paginated list of learners with their associated metrics.

# paths./api/audience/orgs/{org}/registered-users/.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/audience/orgs/{org}/registered-users/over-time.get.description
Get registered user counts over time.

This endpoint provides daily counts of new user registrations over a
specified time period.

Query Parameters:
    start_date (str, optional): Start date for the time range (ISO format)
    end_date (str, optional): End date for the time range (ISO format)

Returns:
    Daily registration counts over the specified time period, with change metrics
    compared to previous periods.

Default time range is the last 7 days if no dates are specified.

# paths./api/audience/orgs/{org}/registered-users/over-time.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/audience/orgs/{org}/registered-users/per-course.get.description
List enrollment statistics on a per-course basis.

This endpoint provides enrollment counts for all courses, with options
to filter for active or inactive enrollments and to include time-based data.

Query Parameters:
    active (bool): Filter for active enrollments when true, inactive when false
    start_date (str, optional): Start date for time-based filtering (ISO format)
    end_date (str, optional): End date for time-based filtering (ISO format)
    page (int, optional): Page number for pagination
    length (int, optional): Number of items per page

Returns:
    A paginated list of courses with their enrollment counts and percentages.

# paths./api/audience/orgs/{org}/registered-users/per-course.get.parameters[].description
Any of `y`, `yes`, `true`. set to false or no for unenrollments 

* `y` - y
* `yes` - yes
* `true` - true
* `True` - True
* `n` - n
* `no` - no
* `false` - false
* `False` - False

# paths./api/audience/orgs/{org}/registered-users/per-course.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/billing/access-check/{item_type}/{item_id}/.get.description
Check whether the authenticated user has payment access to an item.

# paths./api/billing/access-check/{item_type}/{item_id}/.get.parameters[].description
Platform key. Omit to resolve from request context.

# paths./api/billing/account/.get.description
Return display credits (available_credits, has_credits, account_id) and auto-recharge settings. Pass platform_key (or key) to see platform balance if you are a platform admin.

# paths./api/billing/account/.get.parameters[].description
The unique key of the platform to access. If not provided, defaults to 'main' (user's own account).

# paths./api/billing/account/.put.description
Update auto_recharge_threshold_usd, auto_recharge_amount_usd, auto_recharge_enabled, and/or auto_recharge_spending_limit_usd. When enabling auto-recharge, missing values are calculated: if only limit set, amount = 20% of limit; if only amount set, limit = 5x amount; if neither set, defaults are limit=20, amount=4. Pass platform_key in the request body to update platform settings.

# paths./api/billing/account/.patch.description
Same as PUT; partial update of auto-recharge fields.

# paths./api/billing/auto-recharge/trigger/.post.description
With amount_usd: manual top-up (charge that amount, add credits; no threshold/limit/cooldown). Without amount_usd: run auto-recharge once if enabled and balance below threshold. Returns 400 if skipped or failed (e.g. no payment method, cooldown). Pass platform_key in request body.

# paths./api/billing/items/{item_unique_id}/access-check/.get.description
Check whether the authenticated user has payment access to an item.

# paths./api/billing/items/{item_unique_id}/access-check/.get.parameters[].description
Platform key. Omit to resolve from request context.

# paths./api/billing/items/{item_unique_id}/checkout/.post.description
Create a Stripe checkout session for an authenticated user to purchase or subscribe to an item.

# paths./api/billing/items/{item_unique_id}/checkout-callback/.get.description
Stripe redirects here after checkout. Processes the completed session and redirects to the return URL.

# paths./api/billing/items/{item_unique_id}/checkout-callback/{checkout_.get.description
Stripe redirects here after checkout. Processes the completed session and redirects to the return URL.

# paths./api/billing/items/{item_unique_id}/checkout-guest/.post.description
Create a Stripe checkout session for a guest user (email required).

# paths./api/billing/items/{item_unique_id}/paywall/.get.description
Retrieve the paywall configuration for an item. Returns default (disabled) config if none exists.

# paths./api/billing/items/{item_unique_id}/paywall/.post.description
Enable or configure the paywall for an item. Creates a Stripe product on first enable.

# paths./api/billing/items/{item_unique_id}/paywall/.put.description
Same as POST. Update the paywall configuration for an item.

# paths./api/billing/items/{item_unique_id}/paywall/.delete.description
Disable the paywall for an item. Does not delete the configuration.

# paths./api/billing/items/{item_unique_id}/paywall/prices/.get.description
List active prices for an item's paywall configuration.

# paths./api/billing/items/{item_unique_id}/paywall/prices/.post.description
Create a new price tier for an item. Requires paywall to be enabled and Stripe Connect account ready.

# paths./api/billing/items/{item_unique_id}/pricing/.get.description
Retrieve public pricing information for an item. No authentication required.

# paths./api/billing/items/{item_unique_id}/public-pricing/.get.description
Retrieve public pricing information for an item. No authentication required.

# paths./api/billing/items/{item_unique_id}/scoped-access-check/.get.description
Check whether the authenticated user has payment access to an item on a scoped platform.

# paths./api/billing/items/{item_unique_id}/subscribers/.get.description
List all subscribers for an item. Optionally filter by subscription status.

# paths./api/billing/items/{item_unique_id}/subscribers/.get.parameters[].description
A page number within the paginated result set.

# paths./api/billing/items/{item_unique_id}/subscribers/.get.parameters[].description
* `active` - Active
* `free` - Free Tier
* `grandfathered` - Grandfathered
* `trialing` - Trialing
* `past_due` - Past Due
* `canceled` - Canceled
* `incomplete` - Incomplete

# paths./api/billing/items/{item_unique_id}/subscription/.get.description
Retrieve the current user's subscription to an item.

# paths./api/billing/items/{item_unique_id}/subscription/cancel/.post.description
Cancel the current user's subscription. Returns a Stripe customer portal URL for recurring subscriptions, or cancels directly for one-time purchases.

# paths./api/billing/items/prices/{price_unique_id}/.put.description
Update a price tier. If pricing fields change and a Stripe price exists, a new Stripe price is created and the old one deactivated.

# paths./api/billing/items/prices/{price_unique_id}/.delete.description
Soft-delete a price tier and deactivate the corresponding Stripe price.

# paths./api/billing/items/prices/{price_unique_id}/checkout/.post.description
Create a Stripe checkout session for an authenticated user to purchase or subscribe to an item.

# paths./api/billing/platforms/{platform_key}/items/{item_type}/{item_id.get.description
Check whether the authenticated user has payment access to an item on a scoped platform.

# paths./api/billing/platforms/{platform_key}/items/{item_type}/{item_id.post.description
Create a Stripe checkout session for an authenticated user to purchase or subscribe to an item.

# paths./api/billing/platforms/{platform_key}/items/{item_type}/{item_id.get.description
Stripe redirects here after checkout. Processes the completed session and redirects to the return URL.

# paths./api/billing/platforms/{platform_key}/items/{item_type}/{item_id.get.description
Stripe redirects here after checkout. Processes the completed session and redirects to the return URL.

# paths./api/billing/platforms/{platform_key}/items/{item_type}/{item_id.post.description
Create a Stripe checkout session for a guest user (email required).

# paths./api/billing/platforms/{platform_key}/items/{item_type}/{item_id.get.description
Retrieve the paywall configuration for an item. Returns default (disabled) config if none exists.

# paths./api/billing/platforms/{platform_key}/items/{item_type}/{item_id.post.description
Enable or configure the paywall for an item. Creates a Stripe product on first enable.

# paths./api/billing/platforms/{platform_key}/items/{item_type}/{item_id.put.description
Same as POST. Update the paywall configuration for an item.

# paths./api/billing/platforms/{platform_key}/items/{item_type}/{item_id.delete.description
Disable the paywall for an item. Does not delete the configuration.

# paths./api/billing/platforms/{platform_key}/items/{item_type}/{item_id.get.description
List active prices for an item's paywall configuration.

# paths./api/billing/platforms/{platform_key}/items/{item_type}/{item_id.post.description
Create a new price tier for an item. Requires paywall to be enabled and Stripe Connect account ready.

# paths./api/billing/platforms/{platform_key}/items/{item_type}/{item_id.put.description
Update a price tier. If pricing fields change and a Stripe price exists, a new Stripe price is created and the old one deactivated.

# paths./api/billing/platforms/{platform_key}/items/{item_type}/{item_id.delete.description
Soft-delete a price tier and deactivate the corresponding Stripe price.

# paths./api/billing/platforms/{platform_key}/items/{item_type}/{item_id.get.description
Retrieve public pricing information for an item. No authentication required.

# paths./api/billing/platforms/{platform_key}/items/{item_type}/{item_id.get.description
List all subscribers for an item. Optionally filter by subscription status.

# paths./api/billing/platforms/{platform_key}/items/{item_type}/{item_id.get.parameters[].description
A page number within the paginated result set.

# paths./api/billing/platforms/{platform_key}/items/{item_type}/{item_id.get.parameters[].description
* `active` - Active
* `free` - Free Tier
* `grandfathered` - Grandfathered
* `trialing` - Trialing
* `past_due` - Past Due
* `canceled` - Canceled
* `incomplete` - Incomplete

# paths./api/billing/platforms/{platform_key}/items/{item_type}/{item_id.get.description
Retrieve the current user's subscription to an item.

# paths./api/billing/platforms/{platform_key}/items/{item_type}/{item_id.post.description
Cancel the current user's subscription. Returns a Stripe customer portal URL for recurring subscriptions, or cancels directly for one-time purchases.

# paths./api/billing/platforms/{platform_key}/my-subscriptions/.get.description
Paginated list of the current user's subscriptions on a platform. Optionally filter by status or item_type.

# paths./api/billing/platforms/{platform_key}/my-subscriptions/.get.parameters[].description
A page number within the paginated result set.

# paths./api/billing/platforms/{platform_key}/my-subscriptions/.get.parameters[].description
* `active` - Active
* `free` - Free Tier
* `grandfathered` - Grandfathered
* `trialing` - Trialing
* `past_due` - Past Due
* `canceled` - Canceled
* `incomplete` - Incomplete

# paths./api/billing/platforms/{platform_key}/paywalls/.get.description
Paginated list of all item paywall configurations on a platform. Filterable by item_type and is_enabled.

# paths./api/billing/platforms/{platform_key}/paywalls/.get.summary
List all platform paywall configurations

# paths./api/billing/platforms/{platform_key}/paywalls/.get.parameters[].description
A page number within the paginated result set.

# paths./api/billing/platforms/{platform_key}/revenue/.get.description
Aggregate sales volume and count for a platform across all item types.

# paths./api/billing/platforms/{platform_key}/subscribers/.get.description
Paginated list of all subscribers across all items on a platform. Filterable by status and item_type.

# paths./api/billing/platforms/{platform_key}/subscribers/.get.parameters[].description
A page number within the paginated result set.

# paths./api/billing/platforms/{platform_key}/subscribers/.get.parameters[].description
* `active` - Active
* `free` - Free Tier
* `grandfathered` - Grandfathered
* `trialing` - Trialing
* `past_due` - Past Due
* `canceled` - Canceled
* `incomplete` - Incomplete

# paths./api/billing/prices/{price_unique_id}/checkout-guest/.post.description
Looks up the price by its unique_id, derives platform/item_type/item_id, and delegates to the standard guest checkout flow.

# paths./api/billing/prices/{price_unique_id}/checkout-guest/.post.summary
Create guest checkout session by price unique_id

# paths./api/billing/transactions/.get.description
Paginated transaction history for the credit account. Use platform_key query param to list platform account transactions (if permitted). Filter by transaction_type, from_date (YYYY-MM-DD), to_date (YYYY-MM-DD).

# paths./api/billing/transactions/.get.parameters[].description
Filter from date (YYYY-MM-DD), inclusive.

# paths./api/billing/transactions/.get.parameters[].description
Platform key. Omit for user's own account.

# paths./api/billing/transactions/.get.parameters[].description
Filter by transaction type.

* `add` - add
* `subtract` - subtract
* `reserve` - reserve
* `release` - release
* `rollover` - rollover
* `refund` - refund

# paths./api/career/location/orgs/{org}/users/{username}/.get.description
API endpoint for managing user base locations

# paths./api/career/location/orgs/{org}/users/{username}/.post.description
API endpoint for managing user base locations

# paths./api/career/location/orgs/{org}/users/{username}/.put.description
API endpoint for managing user base locations

# paths./api/career/locations/orgs/{org}/.get.description
Platform-wide location statistics (GET only)

# paths./api/catalog/access_requests/course/manage/.get.description
Retrieve a paginated list of access requests

# paths./api/catalog/access_requests/course/manage/.get.parameters[].description
The organization identifier for the platform

# paths./api/catalog/access_requests/course/manage/.get.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/access_requests/course/manage/.post.description
Update an existing access request (approve/reject)

# paths./api/catalog/access_requests/course/manage/.post.parameters[].description
The organization identifier for the platform

# paths./api/catalog/access_requests/course/manage/.post.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/access_requests/course/manage/.post.responses.404.description
Not found - platform or access request doesn't exist

# paths./api/catalog/access_requests/course/request/.get.description
Check if the user has an active access request for a course

# paths./api/catalog/access_requests/course/request/.get.parameters[].description
The organization identifier for the platform

# paths./api/catalog/access_requests/course/request/.get.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/access_requests/course/request/.get.responses.404.description
Not found - platform or course doesn't exist

# paths./api/catalog/access_requests/course/request/.post.description
Create a new access request for a course

# paths./api/catalog/access_requests/course/request/.post.parameters[].description
The organization identifier for the platform

# paths./api/catalog/access_requests/course/request/.post.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/access_requests/course/request/.post.responses.404.description
Not found - platform or course doesn't exist

# paths./api/catalog/conditionals/course/eligibility/.get.description
GET
Retrieve prerequisite eligibility info for user/course

Params:
user_id/username
course_id

# paths./api/catalog/conditionals/course/prerequisites/manage/.get.description
GET
Retrieve prerequisite info for course

Params:
course_id

key_only

# paths./api/catalog/conditionals/course/prerequisites/manage/bulk/.post.description
Prerequisite bulk management view

Params:
course_id

rules
key_only

# paths./api/catalog/courses/.get.description
Retrieve courses matching specified filters.

# paths./api/catalog/courses/.get.parameters[].description
Filter courses by their unique identifier

# paths./api/catalog/courses/.get.parameters[].description
Filter courses by their associated organization

# paths./api/catalog/courses/.get.parameters[].description
Filter courses by their slug (case-insensitive)

# paths./api/catalog/courses/.post.parameters[].description
Filter courses by their unique identifier

# paths./api/catalog/courses/.post.parameters[].description
Filter courses by their associated organization

# paths./api/catalog/courses/.post.parameters[].description
Filter courses by their slug (case-insensitive)

# paths./api/catalog/courses/.delete.parameters[].description
The unique identifier for the course to be deleted

# paths./api/catalog/courses/.delete.parameters[].description
Filter courses by their associated organization

# paths./api/catalog/courses/.delete.parameters[].description
Filter courses by their slug (case-insensitive)

# paths./api/catalog/eligibility/courses/.get.description
List courses that a user is eligible for.

# paths./api/catalog/eligibility/courses/check/.get.description
Check whether a user is eligible to enroll in a specific course.

# paths./api/catalog/eligibility/courses/check/.get.parameters[].description
Whether to check eligibility only within the local organization

# paths./api/catalog/enrollment/courses/search/.get.description
API View for searching course enrollments.

This endpoint allows searching for course enrollments based on various filters such as user ID,
username, email, course ID, slug, organization, and platform key. Results are paginated and
include detailed enrollment information.

Query Parameters:
    user_id (str, optional): Filter enrollments by user ID
    username (str, optional): Filter enrollments by username
    email (str, optional): Filter enrollments by user email
    course_id (str, optional): Filter enrollments by course ID
    slug (str, optional): Filter enrollments by course slug
    org (str, optional): Filter enrollments by organization
    platform_key (str, optional): Filter enrollments by platform key
    course_name (str, optional): Filter enrollments by course name (partial match)
    include_default_platform (bool, optional): Include enrollments from default platform
    sort (str, optional): Field to sort results by (default: '-id')
    page (int, optional): Page number for pagination
    page_size (int, optional): Number of items per page

Methods:
    GET: Search for course enrollments with filtering and pagination

Returns:
    GET: A paginated JSON response containing course enrollments:
        {
            "count": 42,
            "next": "https://api.example.com/api/catalog/enrollment/courses/search/?page=2",
            "previous": null,
            "results": [
                {
                    "user_id": 123,
                    "username": "student1",
                    "email": "student1@example.com",
                    "course_id": "course-v1:org+course+run",
                    "active": true,
                    "created": "2023-01-15T10:30:00Z",
                    "started": "2023-01-15T10:30:00Z",
                    "ended": null,
                    "expired": null,
                    "metadata": {},
                    "name": "John Doe",
                    "course_name": "Introduction to Data Science"
                },
                ...
            ]
        }

Error Responses:
    400 Bad Request: If required parameters are missing or if enrollment search fails
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to access this resource
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Requires IsDMAdmin, IsEdxUserReadOnly, or IsPlatformAdminOfUserReadOnly permission
    - Users can view their own enrollments
    - Platform admins can view enrollments for users in their platform
    - DM admins can view all enrollments

# paths./api/catalog/enrollment/courses/search/.get.parameters[].description
Filter enrollments by course name (partial match)

# paths./api/catalog/enrollment/courses/search/.get.parameters[].description
Include enrollments from default platform

# paths./api/catalog/enrollment/pathways/.get.description
Search pathway enrollments. Requires user_id or username and pathway_id or slug.

# paths./api/catalog/enrollment/pathways/.get.parameters[].description
Include enrollments from default platform

# paths./api/catalog/enrollment/pathways/.post.parameters[].description
Include enrollments from default platform

# paths./api/catalog/enrollment/pathways/.delete.description
Unenroll from a pathway. Deactivates enrollment.

# paths./api/catalog/enrollment/pathways/.delete.parameters[].description
Include enrollments from default platform

# paths./api/catalog/enrollment/pathways/search/.get.description
Search pathway enrollments based on user or pathway identifiers. Returns paginated enrollment results.

# paths./api/catalog/enrollment/pathways/self/.delete.description
Unenroll from a pathway. Deactivates enrollment.

# paths./api/catalog/enrollment/programs/.get.description
Search program enrollments. Requires user_id or username and program_id or slug.

# paths./api/catalog/enrollment/programs/.get.parameters[].description
Whether to ignore expiration during unenrollment

# paths./api/catalog/enrollment/programs/.get.parameters[].description
Include enrollments from default platform

# paths./api/catalog/enrollment/programs/.get.parameters[].description
Program type (standard, platform, custom)

# paths./api/catalog/enrollment/programs/.post.parameters[].description
Whether to ignore expiration during unenrollment

# paths./api/catalog/enrollment/programs/.post.parameters[].description
Include enrollments from default platform

# paths./api/catalog/enrollment/programs/.post.parameters[].description
Program type (standard, platform, custom)

# paths./api/catalog/enrollment/programs/.delete.description
Unenroll from a program. Deactivates enrollment.

# paths./api/catalog/enrollment/programs/.delete.parameters[].description
Whether to ignore expiration during unenrollment

# paths./api/catalog/enrollment/programs/.delete.parameters[].description
Include enrollments from default platform

# paths./api/catalog/enrollment/programs/.delete.parameters[].description
Program type (standard, platform, custom)

# paths./api/catalog/enrollment/programs/search/.get.description
Search program enrollments based on user or program identifiers. Returns paginated enrollment results.

# paths./api/catalog/enrollment/programs/search/.get.parameters[].description
Include enrollments from default platform

# paths./api/catalog/enrollment/programs/search/.get.parameters[].description
Filter by program type (standard, platform, custom)

# paths./api/catalog/enrollment/programs/self/.post.parameters[].description
Whether to ignore expiration during unenrollment

# paths./api/catalog/enrollment/programs/self/.delete.description
Unenroll from a program. Deactivates enrollment.

# paths./api/catalog/enrollment/programs/self/.delete.parameters[].description
Whether to ignore expiration during unenrollment

# paths./api/catalog/increment/.get.description
Retrieve auto increment information for a specific platform.

# paths./api/catalog/increment/.post.description
Update auto increment information and retrieve a new ID for a specific platform.

# paths./api/catalog/invitations/course/.get.description
Retrieve a paginated list of course invitations

# paths./api/catalog/invitations/course/.get.parameters[].description
Alternative filter by platform organization

# paths./api/catalog/invitations/course/.get.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/invitations/course/.post.parameters[].description
Alternative filter by platform organization

# paths./api/catalog/invitations/course/.post.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/invitations/course/.delete.parameters[].description
Alternative filter by platform organization

# paths./api/catalog/invitations/course/.delete.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/invitations/course/blank/.post.description
Create multiple blank course invitations

# paths./api/catalog/invitations/course/blank/.post.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/invitations/course/bulk/.post.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/invitations/course/redeem/.post.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/invitations/course/redeem/.post.responses.404.description
Not found - no blank invitation available

# paths./api/catalog/invitations/platform/.get.description
API View for managing platform invitations.

This endpoint allows querying, creating, and deleting platform invitations for users.

Query/Request Parameters:
    For GET:
        platform_key (str, optional): Filter by platform key
        org (str, optional): Filter by platform organization
        email (str, optional): Filter by user email
        source (str, optional): Filter by invitation source
        active (bool, optional): Filter by active status
        sort (str, optional): Field to sort results by (default: '-id')
        metadata fields: Any additional parameters will be treated as metadata filters

    For POST:
        platform_key (str, required): The platform to create an invitation for
        email (str, required): The email address to invite
        active (bool, optional): Whether the invitation is active
        metadata fields: Any additional parameters will be added as metadata

    For DELETE:
        id (int, required): The ID of the invitation to delete
        org (str, required): The platform organization for verification

Methods:
    GET: Retrieve a paginated list of platform invitations
    POST: Create a new platform invitation
    DELETE: Remove a platform invitation

Returns:
    GET: A paginated JSON response containing platform invitations:
        {
            "count": 10,
            "next": "https://example.com/api/catalog/invitations/platform/?page=2",
            "previous": null,
            "results": [
                {
                    "id": 123,
                    "user_id": 456,
                    "username": "username",
                    "email": "user@example.com",
                    "created": "2023-06-15T14:30:00Z",
                    "started": "2023-06-15T14:30:00Z",
                    "source": "source",
                    "redirect_to": "https://example.com",
                    "expired": null,
                    "active": true,
                    "metadata": {},
                    "platform_key": "platform1"
                },
                ...
            ]
        }

    POST: A JSON response containing the created invitation:
        {
            "id": 123,
            "user_id": 456,
            "username": "username",
            "email": "user@example.com",
            "created": "2023-06-15T14:30:00Z",
            "started": "2023-06-15T14:30:00Z",
            "source": "source",
            "redirect_to": "https://example.com",
            "expired": null,
            "active": true,
            "metadata": {},
            "platform_key": "platform1"
        }

    DELETE: A success response with status 200

Error Responses:
    400 Bad Request: If required parameters are missing or invalid
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to access this resource
    404 Not Found: If the platform or invitation doesn't exist
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Requires IsDMAdmin or IsPlatformAdmin permission
    - Available to platform administrators and DM admins

# paths./api/catalog/invitations/platform/.get.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/invitations/platform/.post.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/invitations/platform/.delete.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/invitations/platform/blank/.post.description
Create multiple blank platform invitations

# paths./api/catalog/invitations/platform/blank/.post.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/invitations/platform/bulk/.post.description
API View for bulk creating platform invitations.

This endpoint allows creating multiple platform invitations in a single request.

Request Parameters:
    invitation_data (list, required): List of invitation data objects, each containing:
        platform_key (str, required): The platform to create an invitation for
        email (str, required): The email address to invite
        active (bool, optional): Whether the invitation is active
        metadata fields: Any additional parameters will be added as metadata
    platform_key (str, required for platform admins): The platform key for permission validation

Methods:
    POST: Create multiple platform invitations

Returns:
    POST: A JSON response containing the creation results:
        {
            "successes": 5,
            "error_codes": []
        }

Error Responses:
    400 Bad Request: If required parameters are missing or invalid
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to access this resource
    500 Internal Server Error: If an unexpected error occurs during creation

Access Control:
    - Requires IsDMAdmin or IsPlatformAdmin permission
    - Available to platform administrators and DM admins

# paths./api/catalog/invitations/platform/bulk/.post.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/invitations/platform/check/.get.description
Check if a user has an active platform invitation

# paths./api/catalog/invitations/platform/check/.get.parameters[].description
The email address to check for active invitations

# paths./api/catalog/invitations/platform/check/.get.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/invitations/platform/check/.get.responses.404.description
No active invitation exists for the email

# paths./api/catalog/invitations/platform/redeem/.post.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/invitations/platform/redeem/.post.responses.404.description
Not found - no blank invitation available

# paths./api/catalog/invitations/program/.get.description
API View for managing program invitations.

This endpoint allows querying, creating, and deleting program invitations for users.

Query/Request Parameters:
    For GET:
        program_key (str, optional): Filter by program key
        org (str, optional): Filter by platform organization
        email (str, optional): Filter by user email
        source (str, optional): Filter by invitation source
        active (bool, optional): Filter by active status
        sort (str, optional): Field to sort results by (default: '-id')
        metadata fields: Any additional parameters will be treated as metadata filters

    For POST:
        program_key (str, required): The program to create an invitation for
        email (str, required): The email address to invite
        active (bool, optional): Whether the invitation is active
        metadata fields: Any additional parameters will be added as metadata

    For DELETE:
        id (int, required): The ID of the invitation to delete
        org (str, required): The platform organization for verification

Methods:
    GET: Retrieve a paginated list of program invitations
    POST: Create a new program invitation
    DELETE: Remove a program invitation

Returns:
    GET: A paginated JSON response containing program invitations:
        {
            "count": 10,
            "next": "https://example.com/api/catalog/invitations/program/?page=2",
            "previous": null,
            "results": [
                {
                    "id": 123,
                    "user_id": 456,
                    "username": "username",
                    "email": "user@example.com",
                    "created": "2023-06-15T14:30:00Z",
                    "started": "2023-06-15T14:30:00Z",
                    "source": "source",
                    "redirect_to": "https://example.com",
                    "expired": null,
                    "active": true,
                    "metadata": {},
                    "program_key": "org+program1"
                },
                ...
            ]
        }

    POST: A JSON response containing the created invitation:
        {
            "id": 123,
            "user_id": 456,
            "username": "username",
            "email": "user@example.com",
            "created": "2023-06-15T14:30:00Z",
            "started": "2023-06-15T14:30:00Z",
            "source": "source",
            "redirect_to": "https://example.com",
            "expired": null,
            "active": true,
            "metadata": {},
            "program_key": "org+program1"
        }

    DELETE: A success response with status 200

Error Responses:
    400 Bad Request: If required parameters are missing or invalid
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to access this resource
    404 Not Found: If the program or invitation doesn't exist
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Requires IsDMAdmin, IsPlatformAdminReadOnly, or IsPlatformAdminForProgram permission
    - Read-only access for platform admins, full access for DM admins and program-specific admins

# paths./api/catalog/invitations/program/.get.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/invitations/program/.post.description
API View for managing program invitations.

This endpoint allows querying, creating, and deleting program invitations for users.

Query/Request Parameters:
    For GET:
        program_key (str, optional): Filter by program key
        org (str, optional): Filter by platform organization
        email (str, optional): Filter by user email
        source (str, optional): Filter by invitation source
        active (bool, optional): Filter by active status
        sort (str, optional): Field to sort results by (default: '-id')
        metadata fields: Any additional parameters will be treated as metadata filters

    For POST:
        program_key (str, required): The program to create an invitation for
        email (str, required): The email address to invite
        active (bool, optional): Whether the invitation is active
        metadata fields: Any additional parameters will be added as metadata

    For DELETE:
        id (int, required): The ID of the invitation to delete
        org (str, required): The platform organization for verification

Methods:
    GET: Retrieve a paginated list of program invitations
    POST: Create a new program invitation
    DELETE: Remove a program invitation

Returns:
    GET: A paginated JSON response containing program invitations:
        {
            "count": 10,
            "next": "https://example.com/api/catalog/invitations/program/?page=2",
            "previous": null,
            "results": [
                {
                    "id": 123,
                    "user_id": 456,
                    "username": "username",
                    "email": "user@example.com",
                    "created": "2023-06-15T14:30:00Z",
                    "started": "2023-06-15T14:30:00Z",
                    "source": "source",
                    "redirect_to": "https://example.com",
                    "expired": null,
                    "active": true,
                    "metadata": {},
                    "program_key": "org+program1"
                },
                ...
            ]
        }

    POST: A JSON response containing the created invitation:
        {
            "id": 123,
            "user_id": 456,
            "username": "username",
            "email": "user@example.com",
            "created": "2023-06-15T14:30:00Z",
            "started": "2023-06-15T14:30:00Z",
            "source": "source",
            "redirect_to": "https://example.com",
            "expired": null,
            "active": true,
            "metadata": {},
            "program_key": "org+program1"
        }

    DELETE: A success response with status 200

Error Responses:
    400 Bad Request: If required parameters are missing or invalid
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to access this resource
    404 Not Found: If the program or invitation doesn't exist
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Requires IsDMAdmin, IsPlatformAdminReadOnly, or IsPlatformAdminForProgram permission
    - Read-only access for platform admins, full access for DM admins and program-specific admins

# paths./api/catalog/invitations/program/.post.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/invitations/program/.delete.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/invitations/program/blank/.post.description
API View for creating blank program invitations.

This endpoint allows creating multiple blank program invitations (without user association)
that can be redeemed later.

Request Parameters:
    program_key (str, required): The program to create invitations for
    source (str, required): The source identifier for the invitations
    count (int, required): The number of blank invitations to create
    metadata fields: Any additional parameters will be added as metadata

Methods:
    POST: Create multiple blank program invitations

Returns:
    POST: A JSON response containing the creation results:
        {
            "successes": 10,
            "error_codes": []
        }

Error Responses:
    400 Bad Request: If required parameters are missing or invalid
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to access this resource
    500 Internal Server Error: If an unexpected error occurs during creation

Access Control:
    - Requires IsDMAdmin or IsPlatformAdminForProgram permission
    - Available to DM admins and platform admins for the specific program

# paths./api/catalog/invitations/program/blank/.post.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/invitations/program/bulk/.post.description
API View for bulk creation of program invitations.

This endpoint allows creating multiple program invitations at once.

Request Parameters:
    invitation_data (list, required): List of invitation data objects, each containing:
        program_key (str, required): The program to create an invitation for
        email (str, required): The email address to invite
        active (bool, optional): Whether the invitation is active
        metadata fields: Any additional parameters will be added as metadata
    platform_key (str, required for platform admins): The platform key for permission validation

Methods:
    POST: Create multiple program invitations

Returns:
    POST: A JSON response containing the creation results:
        {
            "successes": 5,
            "error_codes": []
        }

Error Responses:
    400 Bad Request: If required parameters are missing or invalid
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to access this resource
    500 Internal Server Error: If an unexpected error occurs during creation

Access Control:
    - Requires IsDMAdmin or IsPlatformAdmin permission
    - Available to platform administrators and DM admins

# paths./api/catalog/invitations/program/bulk/.post.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/invitations/program/redeem/.post.description
API View for redeeming blank program invitations.

This endpoint allows redeeming a blank program invitation by associating it with a user.

Request Parameters:
    program_key (str, required): The program key for the invitation
    source (str, required): The source identifier for the invitation
    email (str, optional): The email to associate with the invitation
    username (str, optional): The username to associate with the invitation
    metadata fields: Any additional parameters will be added as metadata

Methods:
    POST: Redeem a blank program invitation

Returns:
    POST: A JSON response containing the redeemed invitation:
        {
            "id": 123,
            "user_id": 456,
            "username": "username",
            "email": "user@example.com",
            "created": "2023-06-15T14:30:00Z",
            "started": "2023-06-15T14:30:00Z",
            "source": "source",
            "redirect_to": "https://example.com",
            "expired": null,
            "active": true,
            "metadata": {},
            "program_key": "org+program1"
        }

Error Responses:
    400 Bad Request: If required parameters are missing or invalid
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to access this resource
    404 Not Found: If no blank invitation is available
    500 Internal Server Error: If an unexpected error occurs during redemption

Access Control:
    - Requires IsDMAdmin or IsPlatformAdminForProgram permission
    - Available to DM admins and platform admins for the specific program

# paths./api/catalog/invitations/program/redeem/.post.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/invitations/program/redeem/.post.responses.404.description
Not found - no blank invitation available

# paths./api/catalog/licenses/course/.get.description
Retrieve a paginated list of course licenses

# paths./api/catalog/licenses/course/.get.parameters[].description
Alternative filter by platform organization

# paths./api/catalog/licenses/course/.get.parameters[].description
The organization identifier for the platform

# paths./api/catalog/licenses/course/.get.parameters[].description
Include detailed assignment data in the response

# paths./api/catalog/licenses/course/.get.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/licenses/course/assignment/.get.description
Retrieve a paginated list of course license assignments

# paths./api/catalog/licenses/course/assignment/.get.parameters[].description
The organization identifier for the platform

# paths./api/catalog/licenses/course/assignment/.get.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/licenses/course/assignment/.post.description
Create or update a course license assignment

# paths./api/catalog/licenses/course/assignment/.post.parameters[].description
The organization identifier for the platform

# paths./api/catalog/licenses/course/assignment/.post.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/licenses/course/assignment/.post.responses.404.description
Not found - license or user doesn't exist

# paths./api/catalog/licenses/course/assignment/.delete.parameters[].description
The organization identifier for the platform

# paths./api/catalog/licenses/course/assignment/.delete.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/licenses/course/assignment/group/.get.description
Retrieve a paginated list of course license group assignments

# paths./api/catalog/licenses/course/assignment/group/.get.parameters[].description
The organization identifier for the platform

# paths./api/catalog/licenses/course/assignment/group/.get.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/licenses/course/assignment/group/.post.description
Create or update a course license group assignment

# paths./api/catalog/licenses/course/assignment/group/.post.parameters[].description
The organization identifier for the platform

# paths./api/catalog/licenses/course/assignment/group/.post.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/licenses/course/assignment/group/.post.responses.404.description
Not found - license or group doesn't exist

# paths./api/catalog/licenses/course/assignment/group/.delete.description
Remove a course license group assignment

# paths./api/catalog/licenses/course/assignment/group/.delete.parameters[].description
The organization identifier for the platform

# paths./api/catalog/licenses/course/assignment/group/.delete.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/licenses/course/create/.post.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/licenses/course/create/.post.responses.404.description
Not found - course or platform doesn't exist

# paths./api/catalog/licenses/course/update/.post.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/licenses/platform/.get.description
Retrieve a paginated list of platform licenses

# paths./api/catalog/licenses/platform/.get.parameters[].description
Include detailed assignment data in the response

# paths./api/catalog/licenses/platform/create/.post.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/licenses/platform/update/.post.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/licenses/program/.get.description
API View for managing program licenses.

This endpoint allows retrieving program licenses with filtering and pagination support.

Query Parameters:
    platform_key (str, optional): The unique identifier for the platform
    name (str, optional): Filter by license name (exact match)
    source (str, optional): Filter by license source
    active (bool, optional): Filter by active status
    program_id (str, optional): Filter by program ID
    query (str, optional): Search licenses by name (contains)
    page (int, optional): Page number for pagination
    page_size (int, optional): Number of items per page
    verbose (bool, optional): Include additional details in response
    sort (str, optional): Field to sort results by (default: '-id')

Methods:
    GET: Retrieve a paginated list of program licenses

Returns:
    GET: A paginated JSON response containing program licenses:
        {
            "count": 10,
            "next": "https://example.com/api/catalog/licenses/program/?page=2",
            "previous": null,
            "results": [
                {
                    "id": 123,
                    "created": "2023-06-15T14:30:00Z",
                    "started": "2023-06-15T14:30:00Z",
                    "expired": null,
                    "name": "Program License 2023",
                    "count": 100,
                    "active": true,
                    "metadata": {},
                    "source": "source",
                    "external_id": "ext-123",
                    "platform_key": "platform1",
                    "program_id": "program-v1:org+program+run",
                    "assignments": {
                        "total": 50,
                        "active": 45,
                        "pending": 5
                    }
                },
                ...
            ]
        }

Error Responses:
    400 Bad Request: If query parameters are invalid
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to access this resource
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Requires IsDMAdmin or IsPlatformAdminReadOnly permission
    - Available to platform administrators (read-only) and DM admins

# paths./api/catalog/licenses/program/.get.parameters[].description
Alternative filter by platform organization

# paths./api/catalog/licenses/program/.get.parameters[].description
The organization identifier for the platform

# paths./api/catalog/licenses/program/.get.parameters[].description
Field to sort results by (e.g., '-id', 'created', '-created')

# paths./api/catalog/licenses/program/.get.parameters[].description
Include detailed assignment data in the response

# paths./api/catalog/licenses/program/assignment/.get.description
Retrieve a paginated list of program license assignments

# paths./api/catalog/licenses/program/assignment/.get.parameters[].description
Filter by the active status of assignments

# paths./api/catalog/licenses/program/assignment/.get.parameters[].description
Filter by the fulfilled status of assignments

# paths./api/catalog/licenses/program/assignment/.get.parameters[].description
The organization identifier for the platform

# paths./api/catalog/licenses/program/assignment/.get.parameters[].description
Field to sort results by (e.g., 'id', '-id', 'created', '-created')

# paths./api/catalog/licenses/program/assignment/.get.parameters[].description
Filter assignments for a specific user ID

# paths./api/catalog/licenses/program/assignment/.get.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/licenses/program/assignment/.post.description
Create or update a program license assignment

# paths./api/catalog/licenses/program/assignment/.post.parameters[].description
Filter by the active status of assignments

# paths./api/catalog/licenses/program/assignment/.post.parameters[].description
Filter by the fulfilled status of assignments

# paths./api/catalog/licenses/program/assignment/.post.parameters[].description
The organization identifier for the platform

# paths./api/catalog/licenses/program/assignment/.post.parameters[].description
Field to sort results by (e.g., 'id', '-id', 'created', '-created')

# paths./api/catalog/licenses/program/assignment/.post.parameters[].description
Filter assignments for a specific user ID

# paths./api/catalog/licenses/program/assignment/.post.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/licenses/program/assignment/.post.responses.404.description
Not found - license or user doesn't exist

# paths./api/catalog/licenses/program/assignment/.delete.parameters[].description
Filter by the active status of assignments

# paths./api/catalog/licenses/program/assignment/.delete.parameters[].description
Filter by the fulfilled status of assignments

# paths./api/catalog/licenses/program/assignment/.delete.parameters[].description
The unique identifier for the platform (for permission validation)

# paths./api/catalog/licenses/program/assignment/.delete.parameters[].description
The organization identifier for the platform (for permission validation)

# paths./api/catalog/licenses/program/assignment/.delete.parameters[].description
Field to sort results by (e.g., 'id', '-id', 'created', '-created')

# paths./api/catalog/licenses/program/assignment/.delete.parameters[].description
Filter assignments for a specific user ID

# paths./api/catalog/licenses/program/assignment/.delete.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/licenses/program/assignment/group/.get.description
Retrieve a paginated list of program license group assignments

# paths./api/catalog/licenses/program/assignment/group/.get.parameters[].description
Filter by the active status of group assignments

# paths./api/catalog/licenses/program/assignment/group/.get.parameters[].description
Filter by the fulfilled status of group assignments

# paths./api/catalog/licenses/program/assignment/group/.get.parameters[].description
Filter assignments for a specific user group ID

# paths./api/catalog/licenses/program/assignment/group/.get.parameters[].description
The organization identifier for the platform

# paths./api/catalog/licenses/program/assignment/group/.get.parameters[].description
Field to sort results by (e.g., 'id', '-id', 'created', '-created')

# paths./api/catalog/licenses/program/assignment/group/.get.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/licenses/program/assignment/group/.post.description
Create or update a program license group assignment

# paths./api/catalog/licenses/program/assignment/group/.post.parameters[].description
Filter by the active status of group assignments

# paths./api/catalog/licenses/program/assignment/group/.post.parameters[].description
Filter by the fulfilled status of group assignments

# paths./api/catalog/licenses/program/assignment/group/.post.parameters[].description
Filter assignments for a specific user group ID

# paths./api/catalog/licenses/program/assignment/group/.post.parameters[].description
The organization identifier for the platform

# paths./api/catalog/licenses/program/assignment/group/.post.parameters[].description
Field to sort results by (e.g., 'id', '-id', 'created', '-created')

# paths./api/catalog/licenses/program/assignment/group/.post.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/licenses/program/assignment/group/.post.responses.404.description
Not found - license or group doesn't exist

# paths./api/catalog/licenses/program/assignment/group/.delete.description
Remove a program license group assignment

# paths./api/catalog/licenses/program/assignment/group/.delete.parameters[].description
Filter by the active status of group assignments

# paths./api/catalog/licenses/program/assignment/group/.delete.parameters[].description
Filter by the fulfilled status of group assignments

# paths./api/catalog/licenses/program/assignment/group/.delete.parameters[].description
Filter assignments for a specific user group ID

# paths./api/catalog/licenses/program/assignment/group/.delete.parameters[].description
The unique identifier for the platform (for permission validation)

# paths./api/catalog/licenses/program/assignment/group/.delete.parameters[].description
The organization identifier for the platform (for permission validation)

# paths./api/catalog/licenses/program/assignment/group/.delete.parameters[].description
Whether to also remove individual user assignments that were created by this group assignment

# paths./api/catalog/licenses/program/assignment/group/.delete.parameters[].description
Field to sort results by (e.g., 'id', '-id', 'created', '-created')

# paths./api/catalog/licenses/program/assignment/group/.delete.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/licenses/program/create/.post.description
API View for creating program licenses.

This endpoint allows administrators to create new program licenses with various configurations.

Methods:
    POST: Create a new program license

Request Body:
    A JSON object containing:
    - platform_key (str, required): The platform to create a license for
    - program_id (str, required): The program ID to create a license for
    - name (str, optional): Display name for the license
    - count (int, optional): Number of seats purchased (default: 0)
    - started (datetime, optional): Date when license should begin
    - expired (datetime, optional): Date when license should expire
    - active (bool, optional): Whether the license is active (default: true)
    - metadata (dict, optional): Additional license metadata
    - enrollment_config (dict, optional): Additional enrollment configuration
    - source (str, optional): Source identifier
    - external_id (str, optional): External identifier (must be unique)

Returns:
    POST: A JSON response containing the created license:
        {
            "id": 123,
            "created": "2023-06-15T14:30:00Z",
            "started": "2023-06-15T14:30:00Z",
            "expired": null,
            "name": "Program License 2023",
            "count": 100,
            "active": true,
            "metadata": {},
            "source": "source",
            "external_id": "ext-123",
            "platform_key": "platform1",
            "program_id": "program-v1:org+program+run"
        }

Error Responses:
    400 Bad Request: If required parameters are missing or invalid
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to create licenses
    500 Internal Server Error: If an unexpected error occurs during license creation

Access Control:
    - Requires IsDMAdmin permission
    - Available only to DM administrators

# paths./api/catalog/licenses/program/create/.post.responses.400.description
Bad request - required parameters missing or invalid

# paths./api/catalog/licenses/program/update/.post.description
API View for updating existing program licenses.

This endpoint allows administrators to update the properties of an existing program license.

Methods:
    POST: Update an existing program license

Request Body:
    A JSON object containing:
    - license_id (int, optional): The ID of the license to update (required if external_id not provided)
    - external_id (str, optional): External identifier of the license to update (required if license_id not provided)
    - name (str, optional): Updated display name for the license
    - count (int, optional): Updated number of seats purchased
    - started (datetime, optional): Updated date when license should begin
    - expired (datetime, optional): Updated date when license should expire
    - active (bool, optional): Updated active status
    - metadata (dict, optional): Updated additional license metadata
    - enrollment_config (dict, optional): Updated enrollment configuration
    - source (str, optional): Updated source identifier
    - change_type (str, optional): Type of change being made (default: "update")

Returns:
    POST: A JSON response containing the updated license:
        {
            "id": 123,
            "created": "2023-06-15T14:30:00Z",
            "started": "2023-06-15T14:30:00Z",
            "expired": "2024-06-15T14:30:00Z",
            "name": "Updated Program License 2023",
            "count": 150,
            "active": true,
            "metadata": {"updated": true},
            "source": "updated-source",
            "external_id": "ext-123",
            "platform_key": "platform1",
            "program_id": "program-v1:org+program+run"
        }

Error Responses:
    400 Bad Request: If required parameters are missing or invalid
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to update licenses
    404 Not Found: If the specified license doesn't exist
    500 Internal Server Error: If an unexpected error occurs during license update

Access Control:
    - Requires IsDMAdmin permission
    - Available only to DM administrators

Notes:
    - Cannot update the platform or program associated with a license
    - A license history record is automatically created for each update

# paths./api/catalog/licenses/program/update/.post.responses.400.description
Bad request - required parameters missing or invalid

# paths./api/catalog/licenses/user/.get.description
Retrieve a paginated list of user licenses

# paths./api/catalog/licenses/user/.get.parameters[].description
Include detailed assignment data in the response

# paths./api/catalog/licenses/user/assignment/.get.description
Retrieve a paginated list of user license assignments

# paths./api/catalog/licenses/user/assignment/.get.parameters[].description
The organization identifier for the platform

# paths./api/catalog/licenses/user/assignment/.get.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/licenses/user/assignment/.post.description
Create or update a user license assignment

# paths./api/catalog/licenses/user/assignment/.post.parameters[].description
The organization identifier for the platform

# paths./api/catalog/licenses/user/assignment/.post.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/licenses/user/assignment/.post.responses.404.description
Not found - license or user doesn't exist

# paths./api/catalog/licenses/user/assignment/.delete.parameters[].description
The organization identifier for the platform

# paths./api/catalog/licenses/user/assignment/.delete.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/licenses/user/assignment/check/.get.description
Check if a user has an active user license assignment

# paths./api/catalog/licenses/user/assignment/check/.get.parameters[].description
The email address to check for active license assignments

# paths./api/catalog/licenses/user/assignment/check/.get.responses.200.description
Active license assignment exists for the email

# paths./api/catalog/licenses/user/assignment/check/.get.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/licenses/user/assignment/check/.get.responses.404.description
No active license assignment exists for the email

# paths./api/catalog/licenses/user/assignment/group/.get.description
Retrieve a paginated list of user license group assignments

# paths./api/catalog/licenses/user/assignment/group/.get.parameters[].description
The organization identifier for the platform

# paths./api/catalog/licenses/user/assignment/group/.get.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/licenses/user/assignment/group/.post.description
Create or update a user license group assignment

# paths./api/catalog/licenses/user/assignment/group/.post.parameters[].description
The organization identifier for the platform

# paths./api/catalog/licenses/user/assignment/group/.post.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/licenses/user/assignment/group/.post.responses.404.description
Not found - license or group doesn't exist

# paths./api/catalog/licenses/user/assignment/group/.delete.parameters[].description
The organization identifier for the platform

# paths./api/catalog/licenses/user/assignment/group/.delete.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/licenses/user/create/.post.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/licenses/user/update/.post.description
API View for updating existing user licenses.

This endpoint allows administrators to update the properties of an existing user license.

Methods:
    POST: Update an existing user license

Request Body:
    A JSON object containing:
    - license_id (int, optional): The ID of the license to update (required if external_id not provided)
    - external_id (str, optional): External identifier of the license to update (required if license_id not provided)
    - name (str, optional): Updated display name for the license
    - count (int, optional): Updated number of seats purchased
    - started (datetime, optional): Updated date when license should begin
    - expired (datetime, optional): Updated date when license should expire
    - active (bool, optional): Updated active status
    - metadata (dict, optional): Updated additional license metadata
    - enrollment_config (dict, optional): Updated enrollment configuration
    - source (str, optional): Updated source identifier
    - change_type (str, optional): Type of change being made (default: "update")

Returns:
    POST: A JSON response containing the updated license:
        {
            "id": 123,
            "created": "2023-06-15T14:30:00Z",
            "started": "2023-06-15T14:30:00Z",
            "expired": "2024-06-15T14:30:00Z",
            "name": "Updated User License 2023",
            "count": 150,
            "active": true,
            "metadata": {"updated": true},
            "source": "updated-source",
            "external_id": "ext-123",
            "platform_key": "platform1"
        }

Error Responses:
    400 Bad Request: If required parameters are missing or invalid
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to update licenses
    404 Not Found: If the specified license doesn't exist
    500 Internal Server Error: If an unexpected error occurs during license update

Access Control:
    - Requires IsDMAdmin permission
    - Available only to DM administrators

Notes:
    - Cannot update the platform associated with a license
    - A license history record is automatically created for each update

# paths./api/catalog/licenses/user/update/.post.responses.400.description
Bad request - missing or invalid parameters

# paths./api/catalog/metadata/choices/.get.description
Query metadata choices based on field_key, scope, and org parameters.

# paths./api/catalog/metadata/choices/.get.parameters[].description
The key of the field for which choices are being queried

# paths./api/catalog/metadata/choices/.get.parameters[].description
The organization context for the metadata choices

# paths./api/catalog/metadata/choices/.get.parameters[].description
The scope within which to query the metadata choices (course, program, pathway, resource)

# paths./api/catalog/metadata/course-search/.post.description
Search for courses matching specified metadata filters.

# paths./api/catalog/metadata/program/.get.description
Retrieve metadata for a specified program

# paths./api/catalog/metadata/program/.get.parameters[].description
The organization associated with the program

# paths./api/catalog/metadata/program/.get.parameters[].description
Platform key identifier (alternative to org)

# paths./api/catalog/metadata/program/.get.parameters[].description
Program key (alternative to program_id + org)

# paths./api/catalog/metadata/program/.post.parameters[].description
The organization associated with the program

# paths./api/catalog/metadata/program/.post.parameters[].description
Platform key identifier (alternative to org)

# paths./api/catalog/metadata/program/.post.parameters[].description
Program key (alternative to program_id + org)

# paths./api/catalog/metadata/program-public/.get.description
Retrieve public metadata for a specified program

# paths./api/catalog/metadata/program-public/.get.parameters[].description
The organization associated with the program

# paths./api/catalog/metadata/program-public/.get.parameters[].description
Platform key identifier (alternative to org)

# paths./api/catalog/metadata/program-public/.get.parameters[].description
Program key (alternative to program_id + org)

# paths./api/catalog/metadata/program-public/.get.responses.404.description
Program not found or no public metadata available

# paths./api/catalog/metadata/program-public/{field}/.get.description
Retrieve public metadata for a specified program

# paths./api/catalog/metadata/program-public/{field}/.get.parameters[].description
The organization associated with the program

# paths./api/catalog/metadata/program-public/{field}/.get.parameters[].description
Platform key identifier (alternative to org)

# paths./api/catalog/metadata/program-public/{field}/.get.parameters[].description
Program key (alternative to program_id + org)

# paths./api/catalog/metadata/program-public/{field}/.get.responses.404.description
Program not found or no public metadata available

# paths./api/catalog/metadata/program/{field}/.get.description
Retrieve metadata for a specified program

# paths./api/catalog/metadata/program/{field}/.get.parameters[].description
The organization associated with the program

# paths./api/catalog/metadata/program/{field}/.get.parameters[].description
Platform key identifier (alternative to org)

# paths./api/catalog/metadata/program/{field}/.get.parameters[].description
Program key (alternative to program_id + org)

# paths./api/catalog/metadata/program/{field}/.post.parameters[].description
The organization associated with the program

# paths./api/catalog/metadata/program/{field}/.post.parameters[].description
Platform key identifier (alternative to org)

# paths./api/catalog/metadata/program/{field}/.post.parameters[].description
Program key (alternative to program_id + org)

# paths./api/catalog/milestones/completions/course/catalog/.get.description
Retrieve catalog-compatible completion info for user

# paths./api/catalog/milestones/completions/course/catalog/.get.parameters[].description
Specific field to include in the response

# paths./api/catalog/milestones/completions/course/manage/.get.description
Retrieve completion information for a specific user and course

# paths./api/catalog/milestones/completions/course/manage/.get.responses.404.description
User, course, or completion record not found

# paths./api/catalog/milestones/completions/course/manage/.post.description
Create or update completion information for a specific user and course

# paths./api/catalog/milestones/completions/pathway/query/.get.parameters[].description
The user identifier (either user_id or username required)

# paths./api/catalog/milestones/completions/pathway/query/.get.parameters[].description
The username (either user_id or username required)

# paths./api/catalog/milestones/completions/pathway/query/.get.responses.404.description
Pathway, user, or completion information not found

# paths./api/catalog/milestones/completions/program/query/.get.parameters[].description
The user identifier (either user_id or username required)

# paths./api/catalog/milestones/completions/program/query/.get.parameters[].description
The username (either user_id or username required)

# paths./api/catalog/milestones/completions/program/query/.get.responses.404.description
Program, user, or completion information not found

# paths./api/catalog/milestones/completions/resource/manage/.get.description
Retrieve completion info for resource/user

# paths./api/catalog/milestones/completions/resource/manage/.get.responses.404.description
Resource, user, or completion record not found

# paths./api/catalog/milestones/completions/resource/manage/.post.description
Create or update completion information for a specific resource and user

# paths./api/catalog/milestones/completions/resource/manage/.post.responses.500.description
Server error during completion creation/update

# paths./api/catalog/milestones/skill_points/block/.get.description
Retrieve skill point information for a specific block

# paths./api/catalog/milestones/skill_points/block/.get.parameters[].description
ID of the block to retrieve skill point information for

# paths./api/catalog/milestones/skill_points/block/.get.parameters[].description
If True, returns skill objects instead of skill names as keys

# paths./api/catalog/milestones/skill_points/block/.post.description
Update skill point information for a specific block

# paths./api/catalog/milestones/skill_points/block/.post.parameters[].description
ID of the block to retrieve skill point information for

# paths./api/catalog/milestones/skill_points/block/.post.parameters[].description
If True, returns skill objects instead of skill names as keys

# paths./api/catalog/milestones/skill_points/course/.get.description
Retrieve skill point information for a specific course

# paths./api/catalog/milestones/skill_points/course/.get.parameters[].description
ID of the course to retrieve skill point information for

# paths./api/catalog/milestones/skill_points/course/.get.parameters[].description
If True, returns skill objects instead of skill names as keys

# paths./api/catalog/milestones/skill_points/course/.post.description
Update skill point information for a specific course

# paths./api/catalog/milestones/skill_points/course/.post.parameters[].description
ID of the course to retrieve skill point information for

# paths./api/catalog/milestones/skill_points/course/.post.parameters[].description
If True, returns skill objects instead of skill names as keys

# paths./api/catalog/milestones/skill_points/course/.post.responses.400.description
Course not found or invalid request data

# paths./api/catalog/milestones/skill_points/platform/.get.description
Retrieve paginated list of platform skill points

# paths./api/catalog/milestones/skill_points/platform/.get.parameters[].description
If True, filters results by department user permissions

# paths./api/catalog/milestones/skill_points/platform/.get.parameters[].description
Search query for filtering skill points by user or skill name

# paths./api/catalog/milestones/skill_points/platform/.get.responses.400.description
Missing platform parameters or retrieval failed

# paths./api/catalog/milestones/skill_points/platform/.post.parameters[].description
If True, filters results by department user permissions

# paths./api/catalog/milestones/skill_points/platform/.post.parameters[].description
Search query for filtering skill points by user or skill name

# paths./api/catalog/milestones/skill_points/platform/.delete.parameters[].description
If True, filters results by department user permissions

# paths./api/catalog/milestones/skill_points/platform/.delete.parameters[].description
Search query for filtering skill points by user or skill name

# paths./api/catalog/milestones/skill_points/platform/bulk/.post.description
Bulk create/update platform skill points

# paths./api/catalog/milestones/skill_points/platform/group/.post.description
Update skill points for all users in a group

# paths./api/catalog/milestones/skill_points/user/.get.description
Retrieve skill point information for a specific user

# paths./api/catalog/milestones/skill_points/user/.get.parameters[].description
ID of the user to retrieve skill point information for

# paths./api/catalog/milestones/skill_points/user/.get.parameters[].description
Username to retrieve skill point information for

# paths./api/catalog/pathways/.get.description
Retrieve pathways matching query. Limited parameters.

# paths./api/catalog/programs/.get.description
Retrieve programs matching query parameters. Limited parameters include program_id, name, slug, enabled, and org.

# paths./api/catalog/programs/.post.description
Add or update a program. Accepts a list of courses and updates or creates a program.

# paths./api/catalog/programs/.delete.description
Remove a program from the database. Requires program_id and org as parameters.

# paths./api/catalog/recommendation/courses/.get.description
GET
Get a 'next' course

This method retrieves the next recommended course for a user based on the provided parameters.
It expects the following parameters in the request query:
- user_id: The ID of the user for whom the next course is being recommended.
- course_id: The ID of the current course.
- org: The organization associated with the course.

Returns:
- A serialized representation of the next course if found, with a status code of 200.
- A status code of 400 if the course_id is not provided.
- A status code of 200 with a None response if no next course is found.

Error Conditions:
- Returns a 400 status code if the course_id is missing from the request parameters.

Side Effects:
- None

# paths./api/catalog/recommendation/courses/.get.parameters[].description
User ID for personalized recommendations

# paths./api/catalog/resources/.get.description
Retrieve resources matching query. Limited parameters.

# paths./api/catalog/resources/.get.parameters[].description
Platform organization (alternative to org)

# paths./api/catalog/resources/.post.description
Create or update a resource. For updates, include the resource ID.

# paths./api/catalog/resources/.post.summary
Create or update a resource with optional image upload

# paths./api/catalog/resources/.post.parameters[].description
Platform organization (alternative to org)

# paths./api/catalog/resources/.delete.parameters[].description
Platform organization (alternative to org)

# paths./api/catalog/resources/search/.get.description
Paginated list of resources matching query parameters. Accepts the same filter parameters as /api/catalog/resources/ and returns the standard paginated envelope (count / next_page / previous_page / results). Default page size is 50; clients can override via ?page_size= and paginate via ?page=. Prefer this endpoint over /api/catalog/resources/ when result counts may be large (e.g. listing Heygen avatars).

# paths./api/catalog/resources/search/.get.parameters[].description
Platform organization (alternative to org)

# paths./api/catalog/resources/search/.get.parameters[].description
Substring match on resource name (icontains)

# paths./api/catalog/reviews/course/.get.description
Retrieve a paginated list of course reviews with filtering options

# paths./api/catalog/reviews/course/.get.parameters[].description
Field to sort results by (default: '-id')

# paths./api/catalog/reviews/course/info/.get.description
Retrieve aggregate review information for a course.

# paths./api/catalog/reviews/course/info/.get.parameters[].description
The course ID to get review information for

# paths./api/catalog/reviews/course/update/.delete.parameters[].description
The user ID of the reviewer (alternative to username)

# paths./api/catalog/reviews/program/.get.description
Retrieve a paginated list of program reviews with filtering options

# paths./api/catalog/reviews/program/.get.parameters[].description
Field to sort results by (default: '-id')

# paths./api/catalog/reviews/program/info/.get.description
Retrieve aggregate review information for a program.

# paths./api/catalog/reviews/program/info/.get.parameters[].description
The program key to get review information for

# paths./api/catalog/reviews/program/update/.delete.parameters[].description
The user ID of the reviewer (alternative to username)

# paths./api/catalog/roles/.get.description
Retrieve roles matching query parameters. Supports filtering by name, id, and slug.

# paths./api/catalog/roles/.get.parameters[].description
Exact match for role name (case insensitive)

# paths./api/catalog/roles/.post.description
Add a new role or update an existing role based on provided data.

# paths./api/catalog/roles/.post.parameters[].description
Exact match for role name (case insensitive)

# paths./api/catalog/roles/public/.post.description
Add or update a role through the public API (when enabled).

# paths./api/catalog/roles/reported/.post.description
Add or update reported roles for a user.

# paths./api/catalog/search/programs/.post.description
POST
Retrieve programs matching query.

Params:
query: The search term used to filter programs.
org: The organization to which the programs belong.

Returns:
A JSON response containing a list of programs that match the search criteria.

Error Conditions:
- If the request data is malformed or missing required fields, a 400 Bad Request may be returned.
- If there is an issue with the database query, a 500 Internal Server Error may be returned.

Side Effects:
- None

Special Return Codes:
- A 200 status code indicates successful retrieval of programs matching the query.

# paths./api/catalog/search/programs/.post.parameters[].description
The organization to which the programs belong

# paths./api/catalog/skills/.get.description
Retrieve skills matching query. Limited parameters.

# paths./api/catalog/skills/.get.parameters[].description
Exact match for skill name (case insensitive)

# paths./api/catalog/skills/.post.parameters[].description
Exact match for skill name (case insensitive)

# paths./api/catalog/skills/desired/.post.description
Add or update desired skills for a user.

# paths./api/catalog/skills/reported/.post.description
Add or update reported skills for a user.

# paths./api/catalog/suggestions/course/manage/.get.description
API View for managing course suggestions.

This endpoint allows administrators to view, create, update, and delete course suggestions
for users within a platform.

Query Parameters (GET):
    platform_key (str, required): The platform to retrieve suggestions for
    platform_org (str, optional): The organization identifier for the platform
    query (str, optional): Search term to filter suggestions
    sort (str, optional): Field to sort results by (default: '-id')
    department_mode (bool, optional): Filter suggestions by department admin access
    page (int, optional): Page number for pagination
    page_size (int, optional): Number of items per page

Methods:
    GET: Retrieve a paginated list of course suggestions for a platform
    POST: Create or update a course suggestion
    DELETE: Remove a course suggestion

Request Body (POST):
    A JSON object containing:
    - platform_key (str, required): The platform for the suggestion
    - course_id (str, required): The course ID to suggest
    - user_id (str/int, required): The user to suggest the course to
    - accepted (bool, optional): Whether the suggestion is accepted
    - visible (bool, optional): Whether the suggestion is visible
    - metadata (dict, optional): Additional suggestion metadata

Query Parameters (DELETE):
    suggestion_id (int, required): The ID of the suggestion to delete

Returns:
    GET: A paginated JSON response containing course suggestions:
        {
            "count": 10,
            "next": "https://example.com/api/catalog/suggestions/course/manage/?page=2",
            "previous": null,
            "results": [
                {
                    "id": 123,
                    "user_id": 456,
                    "username": "student1",
                    "name": "Student Name",
                    "platform_key": "platform1",
                    "accepted": false,
                    "visible": true,
                    "created": "2023-06-15T14:30:00Z",
                    "modified": "2023-06-15T14:30:00Z",
                    "metadata": {},
                    "course_id": "course-v1:org+course+run",
                    "course_name": "Introduction to Programming"
                },
                ...
            ]
        }

    POST: A JSON response containing the created/updated suggestion:
        {
            "id": 123,
            "user_id": 456,
            "username": "student1",
            "name": "Student Name",
            "platform_key": "platform1",
            "accepted": false,
            "visible": true,
            "created": "2023-06-15T14:30:00Z",
            "modified": "2023-06-15T14:30:00Z",
            "metadata": {},
            "course_id": "course-v1:org+course+run",
            "course_name": "Introduction to Programming"
        }

    DELETE: A success response with status 200

Error Responses:
    400 Bad Request: If required parameters are missing or invalid, or if suggestion operations fail
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to manage suggestions
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Requires IsDMAdmin, IsPlatformAdmin, or IsDepartmentModeAdminInPlatform permission
    - Platform admins can manage suggestions for their platform
    - Department admins can manage suggestions for their departments
    - DM admins can manage all suggestions

# paths./api/catalog/suggestions/course/manage/.get.parameters[].description
Filter suggestions by department admin access

# paths./api/catalog/suggestions/course/manage/.get.parameters[].description
The platform to retrieve suggestions for

# paths./api/catalog/suggestions/course/manage/.get.parameters[].description
The organization identifier for the platform

# paths./api/catalog/suggestions/course/manage/.get.responses.400.description
Bad request - required parameters missing or invalid

# paths./api/catalog/suggestions/course/manage/.post.description
API View for managing course suggestions.

This endpoint allows administrators to view, create, update, and delete course suggestions
for users within a platform.

Query Parameters (GET):
    platform_key (str, required): The platform to retrieve suggestions for
    platform_org (str, optional): The organization identifier for the platform
    query (str, optional): Search term to filter suggestions
    sort (str, optional): Field to sort results by (default: '-id')
    department_mode (bool, optional): Filter suggestions by department admin access
    page (int, optional): Page number for pagination
    page_size (int, optional): Number of items per page

Methods:
    GET: Retrieve a paginated list of course suggestions for a platform
    POST: Create or update a course suggestion
    DELETE: Remove a course suggestion

Request Body (POST):
    A JSON object containing:
    - platform_key (str, required): The platform for the suggestion
    - course_id (str, required): The course ID to suggest
    - user_id (str/int, required): The user to suggest the course to
    - accepted (bool, optional): Whether the suggestion is accepted
    - visible (bool, optional): Whether the suggestion is visible
    - metadata (dict, optional): Additional suggestion metadata

Query Parameters (DELETE):
    suggestion_id (int, required): The ID of the suggestion to delete

Returns:
    GET: A paginated JSON response containing course suggestions:
        {
            "count": 10,
            "next": "https://example.com/api/catalog/suggestions/course/manage/?page=2",
            "previous": null,
            "results": [
                {
                    "id": 123,
                    "user_id": 456,
                    "username": "student1",
                    "name": "Student Name",
                    "platform_key": "platform1",
                    "accepted": false,
                    "visible": true,
                    "created": "2023-06-15T14:30:00Z",
                    "modified": "2023-06-15T14:30:00Z",
                    "metadata": {},
                    "course_id": "course-v1:org+course+run",
                    "course_name": "Introduction to Programming"
                },
                ...
            ]
        }

    POST: A JSON response containing the created/updated suggestion:
        {
            "id": 123,
            "user_id": 456,
            "username": "student1",
            "name": "Student Name",
            "platform_key": "platform1",
            "accepted": false,
            "visible": true,
            "created": "2023-06-15T14:30:00Z",
            "modified": "2023-06-15T14:30:00Z",
            "metadata": {},
            "course_id": "course-v1:org+course+run",
            "course_name": "Introduction to Programming"
        }

    DELETE: A success response with status 200

Error Responses:
    400 Bad Request: If required parameters are missing or invalid, or if suggestion operations fail
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to manage suggestions
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Requires IsDMAdmin, IsPlatformAdmin, or IsDepartmentModeAdminInPlatform permission
    - Platform admins can manage suggestions for their platform
    - Department admins can manage suggestions for their departments
    - DM admins can manage all suggestions

# paths./api/catalog/suggestions/course/manage/.post.parameters[].description
Filter suggestions by department admin access

# paths./api/catalog/suggestions/course/manage/.post.parameters[].description
The platform to retrieve suggestions for

# paths./api/catalog/suggestions/course/manage/.post.parameters[].description
The organization identifier for the platform

# paths./api/catalog/suggestions/course/manage/.post.responses.400.description
Bad request - required parameters missing or invalid

# paths./api/catalog/suggestions/course/manage/.delete.parameters[].description
Flag to ensure department admins can call the API

# paths./api/catalog/suggestions/course/manage/.delete.parameters[].description
The platform to retrieve suggestions for

# paths./api/catalog/suggestions/course/manage/.delete.parameters[].description
The organization identifier for the platform

# paths./api/catalog/suggestions/course/manage/.delete.responses.400.description
Bad request - required parameters missing or invalid

# paths./api/catalog/suggestions/course/manage/bulk/.post.description
API View for bulk management of course suggestions.

This endpoint allows administrators to create multiple course suggestions at once.

Methods:
    POST: Create multiple course suggestions in bulk

Request Body:
    A JSON object containing:
    - platform_key (str, required): The platform for the suggestions
    - suggestion_data (list, required): List of suggestion objects, each containing:
      - course_id (str, required): The course ID to suggest
      - user_id (str/int, required): The user to suggest the course to
      - accepted (bool, optional): Whether the suggestion is accepted
      - visible (bool, optional): Whether the suggestion is visible
      - metadata (dict, optional): Additional suggestion metadata

Returns:
    POST: A JSON response containing the operation results:
        {
            "successes": 15,
            "error_codes": []
        }

Error Responses:
    400 Bad Request: If required parameters are missing or invalid
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to manage suggestions
    500 Internal Server Error: If an unexpected error occurs during bulk creation

Access Control:
    - Requires IsDMAdmin, IsPlatformAdmin, or IsDepartmentModeAdminInPlatform permission
    - Platform admins can create suggestions for their platform
    - Department admins can create suggestions for their departments
    - DM admins can create suggestions for any platform

# paths./api/catalog/suggestions/course/manage/bulk/.post.responses.400.description
Bad request - required parameters missing or invalid

# paths./api/catalog/suggestions/course/manage/group/.get.description
API View for managing course group suggestions.

This endpoint allows administrators to view, create, and delete course suggestions
for groups of users within a platform.

Query Parameters (GET):
    platform_key (str, required): The platform to retrieve group suggestions for
    platform_org (str, optional): The organization identifier for the platform
    query (str, optional): Search term to filter group suggestions
    sort (str, optional): Field to sort results by (default: 'id')
    department_mode (bool, optional): Filter suggestions by department admin access
    page (int, optional): Page number for pagination
    page_size (int, optional): Number of items per page

Methods:
    GET: Retrieve a paginated list of course group suggestions for a platform
    POST: Create or update a course group suggestion
    DELETE: Remove a course group suggestion

Request Body (POST):
    A JSON object containing:
    - platform_key (str, required): The platform for the group suggestion
    - course_id (str, required): The course ID to suggest
    - group_id (str/int, required): The group to suggest the course to
    - accepted (bool, optional): Whether the suggestion is accepted
    - visible (bool, optional): Whether the suggestion is visible
    - metadata (dict, optional): Additional suggestion metadata

Query Parameters (DELETE):
    suggestion_id (int, required): The ID of the group suggestion to delete

Returns:
    GET: A paginated JSON response containing course group suggestions:
        {
            "count": 5,
            "next": "https://example.com/api/catalog/suggestions/course/group/?page=2",
            "previous": null,
            "results": [
                {
                    "id": 123,
                    "group_id": 789,
                    "group_name": "Engineering Team",
                    "platform_key": "platform1",
                    "accepted": false,
                    "visible": true,
                    "created": "2023-06-15T14:30:00Z",
                    "modified": "2023-06-15T14:30:00Z",
                    "metadata": {},
                    "course_id": "course-v1:org+course+run",
                    "course_name": "Introduction to Programming",
                    "user_count": 25
                },
                ...
            ]
        }

    POST: A JSON response containing the created/updated group suggestion:
        {
            "id": 123,
            "group_id": 789,
            "group_name": "Engineering Team",
            "platform_key": "platform1",
            "accepted": false,
            "visible": true,
            "created": "2023-06-15T14:30:00Z",
            "modified": "2023-06-15T14:30:00Z",
            "metadata": {},
            "course_id": "course-v1:org+course+run",
            "course_name": "Introduction to Programming",
            "user_count": 25
        }

    DELETE: A success response with status 200

Error Responses:
    400 Bad Request: If required parameters are missing or invalid, or if group suggestion operations fail
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to manage group suggestions
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Requires IsDMAdmin, IsPlatformAdmin, or IsDepartmentModeAdminInPlatform permission
    - Platform admins can manage group suggestions for their platform
    - Department admins can manage group suggestions for their departments
    - DM admins can manage all group suggestions

# paths./api/catalog/suggestions/course/manage/group/.get.parameters[].description
Filter suggestions by department admin access

# paths./api/catalog/suggestions/course/manage/group/.get.parameters[].description
The platform to retrieve group suggestions for

# paths./api/catalog/suggestions/course/manage/group/.get.parameters[].description
The organization identifier for the platform

# paths./api/catalog/suggestions/course/manage/group/.get.responses.400.description
Bad request - required parameters missing or invalid

# paths./api/catalog/suggestions/course/manage/group/.post.description
API View for managing course group suggestions.

This endpoint allows administrators to view, create, and delete course suggestions
for groups of users within a platform.

Query Parameters (GET):
    platform_key (str, required): The platform to retrieve group suggestions for
    platform_org (str, optional): The organization identifier for the platform
    query (str, optional): Search term to filter group suggestions
    sort (str, optional): Field to sort results by (default: 'id')
    department_mode (bool, optional): Filter suggestions by department admin access
    page (int, optional): Page number for pagination
    page_size (int, optional): Number of items per page

Methods:
    GET: Retrieve a paginated list of course group suggestions for a platform
    POST: Create or update a course group suggestion
    DELETE: Remove a course group suggestion

Request Body (POST):
    A JSON object containing:
    - platform_key (str, required): The platform for the group suggestion
    - course_id (str, required): The course ID to suggest
    - group_id (str/int, required): The group to suggest the course to
    - accepted (bool, optional): Whether the suggestion is accepted
    - visible (bool, optional): Whether the suggestion is visible
    - metadata (dict, optional): Additional suggestion metadata

Query Parameters (DELETE):
    suggestion_id (int, required): The ID of the group suggestion to delete

Returns:
    GET: A paginated JSON response containing course group suggestions:
        {
            "count": 5,
            "next": "https://example.com/api/catalog/suggestions/course/group/?page=2",
            "previous": null,
            "results": [
                {
                    "id": 123,
                    "group_id": 789,
                    "group_name": "Engineering Team",
                    "platform_key": "platform1",
                    "accepted": false,
                    "visible": true,
                    "created": "2023-06-15T14:30:00Z",
                    "modified": "2023-06-15T14:30:00Z",
                    "metadata": {},
                    "course_id": "course-v1:org+course+run",
                    "course_name": "Introduction to Programming",
                    "user_count": 25
                },
                ...
            ]
        }

    POST: A JSON response containing the created/updated group suggestion:
        {
            "id": 123,
            "group_id": 789,
            "group_name": "Engineering Team",
            "platform_key": "platform1",
            "accepted": false,
            "visible": true,
            "created": "2023-06-15T14:30:00Z",
            "modified": "2023-06-15T14:30:00Z",
            "metadata": {},
            "course_id": "course-v1:org+course+run",
            "course_name": "Introduction to Programming",
            "user_count": 25
        }

    DELETE: A success response with status 200

Error Responses:
    400 Bad Request: If required parameters are missing or invalid, or if group suggestion operations fail
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to manage group suggestions
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Requires IsDMAdmin, IsPlatformAdmin, or IsDepartmentModeAdminInPlatform permission
    - Platform admins can manage group suggestions for their platform
    - Department admins can manage group suggestions for their departments
    - DM admins can manage all group suggestions

# paths./api/catalog/suggestions/course/manage/group/.post.parameters[].description
Filter suggestions by department admin access

# paths./api/catalog/suggestions/course/manage/group/.post.parameters[].description
The platform to retrieve group suggestions for

# paths./api/catalog/suggestions/course/manage/group/.post.parameters[].description
The organization identifier for the platform

# paths./api/catalog/suggestions/course/manage/group/.post.responses.400.description
Bad request - required parameters missing or invalid

# paths./api/catalog/suggestions/course/manage/group/.delete.description
API View for managing course group suggestions.

This endpoint allows administrators to view, create, and delete course suggestions
for groups of users within a platform.

Query Parameters (GET):
    platform_key (str, required): The platform to retrieve group suggestions for
    platform_org (str, optional): The organization identifier for the platform
    query (str, optional): Search term to filter group suggestions
    sort (str, optional): Field to sort results by (default: 'id')
    department_mode (bool, optional): Filter suggestions by department admin access
    page (int, optional): Page number for pagination
    page_size (int, optional): Number of items per page

Methods:
    GET: Retrieve a paginated list of course group suggestions for a platform
    POST: Create or update a course group suggestion
    DELETE: Remove a course group suggestion

Request Body (POST):
    A JSON object containing:
    - platform_key (str, required): The platform for the group suggestion
    - course_id (str, required): The course ID to suggest
    - group_id (str/int, required): The group to suggest the course to
    - accepted (bool, optional): Whether the suggestion is accepted
    - visible (bool, optional): Whether the suggestion is visible
    - metadata (dict, optional): Additional suggestion metadata

Query Parameters (DELETE):
    suggestion_id (int, required): The ID of the group suggestion to delete

Returns:
    GET: A paginated JSON response containing course group suggestions:
        {
            "count": 5,
            "next": "https://example.com/api/catalog/suggestions/course/group/?page=2",
            "previous": null,
            "results": [
                {
                    "id": 123,
                    "group_id": 789,
                    "group_name": "Engineering Team",
                    "platform_key": "platform1",
                    "accepted": false,
                    "visible": true,
                    "created": "2023-06-15T14:30:00Z",
                    "modified": "2023-06-15T14:30:00Z",
                    "metadata": {},
                    "course_id": "course-v1:org+course+run",
                    "course_name": "Introduction to Programming",
                    "user_count": 25
                },
                ...
            ]
        }

    POST: A JSON response containing the created/updated group suggestion:
        {
            "id": 123,
            "group_id": 789,
            "group_name": "Engineering Team",
            "platform_key": "platform1",
            "accepted": false,
            "visible": true,
            "created": "2023-06-15T14:30:00Z",
            "modified": "2023-06-15T14:30:00Z",
            "metadata": {},
            "course_id": "course-v1:org+course+run",
            "course_name": "Introduction to Programming",
            "user_count": 25
        }

    DELETE: A success response with status 200

Error Responses:
    400 Bad Request: If required parameters are missing or invalid, or if group suggestion operations fail
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to manage group suggestions
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Requires IsDMAdmin, IsPlatformAdmin, or IsDepartmentModeAdminInPlatform permission
    - Platform admins can manage group suggestions for their platform
    - Department admins can manage group suggestions for their departments
    - DM admins can manage all group suggestions

# paths./api/catalog/suggestions/course/manage/group/.delete.parameters[].description
Flag to ensure department admins can call the API

# paths./api/catalog/suggestions/course/manage/group/.delete.parameters[].description
The platform to retrieve group suggestions for

# paths./api/catalog/suggestions/course/manage/group/.delete.parameters[].description
The organization identifier for the platform

# paths./api/catalog/suggestions/course/manage/group/.delete.parameters[].description
The ID of the group suggestion to delete

# paths./api/catalog/suggestions/course/manage/group/.delete.responses.400.description
Bad request - required parameters missing or invalid

# paths./api/catalog/suggestions/course/manage/group/.delete.responses.404.description
Not found - group suggestion does not exist

# paths./api/catalog/suggestions/course/user/.get.description
API View for retrieving course suggestions for a specific user.

This endpoint allows users to view course suggestions that have been made for them,
with support for filtering by platform and pagination.

Query Parameters:
    user (str, required): Username or user ID to retrieve suggestions for
    platform_key (str, optional): Filter suggestions by platform key
    platform_org (str, optional): Filter suggestions by platform organization
    sort (str, optional): Field to sort results by (default: '-id')
    page (int, optional): Page number for pagination
    page_size (int, optional): Number of items per page

Methods:
    GET: Retrieve a paginated list of course suggestions for a user

Returns:
    GET: A paginated JSON response containing course suggestions:
        {
            "count": 10,
            "next": "https://example.com/api/catalog/suggestions/course/user/?page=2",
            "previous": null,
            "results": [
                {
                    "id": 123,
                    "user_id": 456,
                    "username": "student1",
                    "name": "Student Name",
                    "platform_key": "platform1",
                    "accepted": false,
                    "visible": true,
                    "created": "2023-06-15T14:30:00Z",
                    "modified": "2023-06-15T14:30:00Z",
                    "metadata": {},
                    "course_id": "course-v1:org+course+run",
                    "course_name": "Introduction to Programming"
                },
                ...
            ]
        }

Error Responses:
    400 Bad Request: If required parameters are missing or invalid, or if suggestion retrieval fails
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to access this resource
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Requires IsDMAdmin, IsPlatformAdminReadOnly, or IsEdxUserReadOnly permission
    - Users can view their own suggestions
    - Platform admins can view suggestions for users in their platform (read-only)
    - DM admins can view all suggestions

# paths./api/catalog/suggestions/course/user/.get.parameters[].description
Filter suggestions by platform organization

# paths./api/catalog/suggestions/course/user/.get.parameters[].description
Username or user ID to retrieve suggestions for

# paths./api/catalog/suggestions/course/user/.get.responses.400.description
Bad request - required parameters missing or invalid

# paths./api/catalog/suggestions/pathway/manage/.get.description
API View for managing pathway suggestions.

This endpoint allows administrators to view, create, update, and delete pathway suggestions
for users within a platform.

Query Parameters (GET):
    platform_key (str, required): The platform to retrieve suggestions for
    platform_org (str, optional): The organization identifier for the platform
    query (str, optional): Search term to filter suggestions
    sort (str, optional): Field to sort results by (default: '-id')
    department_mode (bool, optional): Filter suggestions by department admin access
    page (int, optional): Page number for pagination
    page_size (int, optional): Number of items per page

Methods:
    GET: Retrieve a paginated list of pathway suggestions for a platform
    POST: Create or update a pathway suggestion
    DELETE: Remove a pathway suggestion

Request Body (POST):
    A JSON object containing:
    - platform_key (str, required): The platform for the suggestion
    - pathway_id (str, required): The pathway ID to suggest
    - user_id (str/int, required): The user to suggest the pathway to
    - accepted (bool, optional): Whether the suggestion is accepted
    - visible (bool, optional): Whether the suggestion is visible
    - metadata (dict, optional): Additional suggestion metadata

Query Parameters (DELETE):
    suggestion_id (int, required): The ID of the suggestion to delete

Returns:
    GET: A paginated JSON response containing pathway suggestions:
        {
            "count": 10,
            "next": "https://example.com/api/catalog/suggestions/pathway/manage/?page=2",
            "previous": null,
            "results": [
                {
                    "id": 123,
                    "user_id": 456,
                    "username": "student1",
                    "name": "Student Name",
                    "platform_key": "platform1",
                    "accepted": false,
                    "visible": true,
                    "created": "2023-06-15T14:30:00Z",
                    "modified": "2023-06-15T14:30:00Z",
                    "metadata": {},
                    "pathway_id": "pathway-v1:org+pathway+run",
                    "pathway_uuid": "12345678-1234-5678-1234-567812345678",
                    "pathway_name": "Data Science Pathway",
                    "pathway_platform_key": "platform1"
                },
                ...
            ]
        }

    POST: A JSON response containing the created/updated suggestion:
        {
            "id": 123,
            "user_id": 456,
            "username": "student1",
            "name": "Student Name",
            "platform_key": "platform1",
            "accepted": false,
            "visible": true,
            "created": "2023-06-15T14:30:00Z",
            "modified": "2023-06-15T14:30:00Z",
            "metadata": {},
            "pathway_id": "pathway-v1:org+pathway+run",
            "pathway_uuid": "12345678-1234-5678-1234-567812345678",
            "pathway_name": "Data Science Pathway",
            "pathway_platform_key": "platform1"
        }

    DELETE: A success response with status 200

Error Responses:
    400 Bad Request: If required parameters are missing or invalid, or if suggestion operations fail
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to manage suggestions
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Requires IsDMAdmin, IsPlatformAdmin, or IsDepartmentModeAdminInPlatform permission
    - Platform admins can manage suggestions for their platform
    - Department admins can manage suggestions for their departments
    - DM admins can manage all suggestions

# paths./api/catalog/suggestions/pathway/manage/.get.parameters[].description
Filter suggestions by department admin access

# paths./api/catalog/suggestions/pathway/manage/.get.parameters[].description
The platform to retrieve suggestions for

# paths./api/catalog/suggestions/pathway/manage/.get.parameters[].description
The organization identifier for the platform

# paths./api/catalog/suggestions/pathway/manage/.get.responses.400.description
Bad request - required parameters missing or invalid

# paths./api/catalog/suggestions/pathway/manage/.post.description
API View for managing pathway suggestions.

This endpoint allows administrators to view, create, update, and delete pathway suggestions
for users within a platform.

Query Parameters (GET):
    platform_key (str, required): The platform to retrieve suggestions for
    platform_org (str, optional): The organization identifier for the platform
    query (str, optional): Search term to filter suggestions
    sort (str, optional): Field to sort results by (default: '-id')
    department_mode (bool, optional): Filter suggestions by department admin access
    page (int, optional): Page number for pagination
    page_size (int, optional): Number of items per page

Methods:
    GET: Retrieve a paginated list of pathway suggestions for a platform
    POST: Create or update a pathway suggestion
    DELETE: Remove a pathway suggestion

Request Body (POST):
    A JSON object containing:
    - platform_key (str, required): The platform for the suggestion
    - pathway_id (str, required): The pathway ID to suggest
    - user_id (str/int, required): The user to suggest the pathway to
    - accepted (bool, optional): Whether the suggestion is accepted
    - visible (bool, optional): Whether the suggestion is visible
    - metadata (dict, optional): Additional suggestion metadata

Query Parameters (DELETE):
    suggestion_id (int, required): The ID of the suggestion to delete

Returns:
    GET: A paginated JSON response containing pathway suggestions:
        {
            "count": 10,
            "next": "https://example.com/api/catalog/suggestions/pathway/manage/?page=2",
            "previous": null,
            "results": [
                {
                    "id": 123,
                    "user_id": 456,
                    "username": "student1",
                    "name": "Student Name",
                    "platform_key": "platform1",
                    "accepted": false,
                    "visible": true,
                    "created": "2023-06-15T14:30:00Z",
                    "modified": "2023-06-15T14:30:00Z",
                    "metadata": {},
                    "pathway_id": "pathway-v1:org+pathway+run",
                    "pathway_uuid": "12345678-1234-5678-1234-567812345678",
                    "pathway_name": "Data Science Pathway",
                    "pathway_platform_key": "platform1"
                },
                ...
            ]
        }

    POST: A JSON response containing the created/updated suggestion:
        {
            "id": 123,
            "user_id": 456,
            "username": "student1",
            "name": "Student Name",
            "platform_key": "platform1",
            "accepted": false,
            "visible": true,
            "created": "2023-06-15T14:30:00Z",
            "modified": "2023-06-15T14:30:00Z",
            "metadata": {},
            "pathway_id": "pathway-v1:org+pathway+run",
            "pathway_uuid": "12345678-1234-5678-1234-567812345678",
            "pathway_name": "Data Science Pathway",
            "pathway_platform_key": "platform1"
        }

    DELETE: A success response with status 200

Error Responses:
    400 Bad Request: If required parameters are missing or invalid, or if suggestion operations fail
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to manage suggestions
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Requires IsDMAdmin, IsPlatformAdmin, or IsDepartmentModeAdminInPlatform permission
    - Platform admins can manage suggestions for their platform
    - Department admins can manage suggestions for their departments
    - DM admins can manage all suggestions

# paths./api/catalog/suggestions/pathway/manage/.post.parameters[].description
Filter suggestions by department admin access

# paths./api/catalog/suggestions/pathway/manage/.post.parameters[].description
The platform to retrieve suggestions for

# paths./api/catalog/suggestions/pathway/manage/.post.parameters[].description
The organization identifier for the platform

# paths./api/catalog/suggestions/pathway/manage/.post.responses.400.description
Bad request - required parameters missing or invalid

# paths./api/catalog/suggestions/pathway/manage/.delete.parameters[].description
Flag to ensure department admins can call the API

# paths./api/catalog/suggestions/pathway/manage/.delete.parameters[].description
The platform to retrieve suggestions for

# paths./api/catalog/suggestions/pathway/manage/.delete.parameters[].description
The organization identifier for the platform

# paths./api/catalog/suggestions/pathway/manage/.delete.responses.400.description
Bad request - required parameters missing or invalid

# paths./api/catalog/suggestions/pathway/manage/bulk/.post.description
API View for bulk creation of pathway suggestions.

This endpoint allows administrators to create multiple pathway suggestions at once.

Methods:
    POST: Create multiple pathway suggestions in a single request

Request Body:
    A JSON object containing:
    - platform_key (str, required): The platform for the suggestions
    - suggestion_data (list, required): List of suggestion objects, each containing:
      - pathway_id (str, required): The pathway ID to suggest
      - user_id (str/int, required): The user to suggest the pathway to
      - accepted (bool, optional): Whether the suggestion is accepted
      - visible (bool, optional): Whether the suggestion is visible
      - metadata (dict, optional): Additional suggestion metadata

Returns:
    POST: A JSON response containing the operation results:
        {
            "successes": 15,
            "error_codes": []
        }

Error Responses:
    400 Bad Request: If required parameters are missing or invalid
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to manage suggestions
    500 Internal Server Error: If an unexpected error occurs during bulk creation

Access Control:
    - Requires IsDMAdmin, IsPlatformAdmin, or IsDepartmentModeAdminInPlatform permission
    - Platform admins can create suggestions for their platform
    - Department admins can create suggestions for their departments
    - DM admins can create suggestions for any platform

# paths./api/catalog/suggestions/pathway/manage/bulk/.post.responses.400.description
Bad request - required parameters missing or invalid

# paths./api/catalog/suggestions/pathway/manage/group/.get.description
API View for managing pathway group suggestions.

This endpoint allows administrators to view, create, and delete pathway suggestions
for groups of users within a platform.

Query Parameters (GET):
    platform_key (str, required): The platform to retrieve group suggestions for
    platform_org (str, optional): The organization identifier for the platform
    query (str, optional): Search term to filter group suggestions
    sort (str, optional): Field to sort results by (default: 'id')
    department_mode (bool, optional): Filter suggestions by department admin access
    page (int, optional): Page number for pagination
    page_size (int, optional): Number of items per page

Methods:
    GET: Retrieve a paginated list of pathway group suggestions for a platform
    POST: Create or update a pathway group suggestion
    DELETE: Remove a pathway group suggestion

Request Body (POST):
    A JSON object containing:
    - platform_key (str, required): The platform for the group suggestion
    - pathway_id (str, required): The pathway ID to suggest
    - group_id (str/int, required): The group to suggest the pathway to
    - accepted (bool, optional): Whether the suggestion is accepted
    - visible (bool, optional): Whether the suggestion is visible
    - metadata (dict, optional): Additional suggestion metadata

Query Parameters (DELETE):
    suggestion_id (int, required): The ID of the group suggestion to delete

Returns:
    GET: A paginated JSON response containing pathway group suggestions:
        {
            "count": 5,
            "next": "https://example.com/api/catalog/suggestions/pathway/group/?page=2",
            "previous": null,
            "results": [
                {
                    "id": 123,
                    "group_id": 789,
                    "group_name": "Engineering Team",
                    "platform_key": "platform1",
                    "accepted": false,
                    "visible": true,
                    "created": "2023-06-15T14:30:00Z",
                    "modified": "2023-06-15T14:30:00Z",
                    "metadata": {},
                    "pathway_id": "pathway-v1:org+pathway+run",
                    "pathway_uuid": "12345678-1234-5678-1234-567812345678",
                    "pathway_name": "Data Science Pathway",
                    "pathway_platform_key": "platform1",
                    "user_count": 25
                },
                ...
            ]
        }

    POST: A JSON response containing the created/updated group suggestion:
        {
            "id": 123,
            "group_id": 789,
            "group_name": "Engineering Team",
            "platform_key": "platform1",
            "accepted": false,
            "visible": true,
            "created": "2023-06-15T14:30:00Z",
            "modified": "2023-06-15T14:30:00Z",
            "metadata": {},
            "pathway_id": "pathway-v1:org+pathway+run",
            "pathway_uuid": "12345678-1234-5678-1234-567812345678",
            "pathway_name": "Data Science Pathway",
            "pathway_platform_key": "platform1",
            "user_count": 25
        }

    DELETE: A success response with status 200

Error Responses:
    400 Bad Request: If required parameters are missing or invalid, or if group suggestion operations fail
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to manage group suggestions
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Requires IsDMAdmin, IsPlatformAdmin, or IsDepartmentModeAdminInPlatform permission
    - Platform admins can manage group suggestions for their platform
    - Department admins can manage group suggestions for their departments
    - DM admins can manage all group suggestions

# paths./api/catalog/suggestions/pathway/manage/group/.get.parameters[].description
Filter suggestions by department admin access

# paths./api/catalog/suggestions/pathway/manage/group/.get.parameters[].description
The platform to retrieve group suggestions for

# paths./api/catalog/suggestions/pathway/manage/group/.get.parameters[].description
The organization identifier for the platform

# paths./api/catalog/suggestions/pathway/manage/group/.get.responses.400.description
Bad request - required parameters missing or invalid

# paths./api/catalog/suggestions/pathway/manage/group/.post.description
API View for managing pathway group suggestions.

This endpoint allows administrators to view, create, and delete pathway suggestions
for groups of users within a platform.

Query Parameters (GET):
    platform_key (str, required): The platform to retrieve group suggestions for
    platform_org (str, optional): The organization identifier for the platform
    query (str, optional): Search term to filter group suggestions
    sort (str, optional): Field to sort results by (default: 'id')
    department_mode (bool, optional): Filter suggestions by department admin access
    page (int, optional): Page number for pagination
    page_size (int, optional): Number of items per page

Methods:
    GET: Retrieve a paginated list of pathway group suggestions for a platform
    POST: Create or update a pathway group suggestion
    DELETE: Remove a pathway group suggestion

Request Body (POST):
    A JSON object containing:
    - platform_key (str, required): The platform for the group suggestion
    - pathway_id (str, required): The pathway ID to suggest
    - group_id (str/int, required): The group to suggest the pathway to
    - accepted (bool, optional): Whether the suggestion is accepted
    - visible (bool, optional): Whether the suggestion is visible
    - metadata (dict, optional): Additional suggestion metadata

Query Parameters (DELETE):
    suggestion_id (int, required): The ID of the group suggestion to delete

Returns:
    GET: A paginated JSON response containing pathway group suggestions:
        {
            "count": 5,
            "next": "https://example.com/api/catalog/suggestions/pathway/group/?page=2",
            "previous": null,
            "results": [
                {
                    "id": 123,
                    "group_id": 789,
                    "group_name": "Engineering Team",
                    "platform_key": "platform1",
                    "accepted": false,
                    "visible": true,
                    "created": "2023-06-15T14:30:00Z",
                    "modified": "2023-06-15T14:30:00Z",
                    "metadata": {},
                    "pathway_id": "pathway-v1:org+pathway+run",
                    "pathway_uuid": "12345678-1234-5678-1234-567812345678",
                    "pathway_name": "Data Science Pathway",
                    "pathway_platform_key": "platform1",
                    "user_count": 25
                },
                ...
            ]
        }

    POST: A JSON response containing the created/updated group suggestion:
        {
            "id": 123,
            "group_id": 789,
            "group_name": "Engineering Team",
            "platform_key": "platform1",
            "accepted": false,
            "visible": true,
            "created": "2023-06-15T14:30:00Z",
            "modified": "2023-06-15T14:30:00Z",
            "metadata": {},
            "pathway_id": "pathway-v1:org+pathway+run",
            "pathway_uuid": "12345678-1234-5678-1234-567812345678",
            "pathway_name": "Data Science Pathway",
            "pathway_platform_key": "platform1",
            "user_count": 25
        }

    DELETE: A success response with status 200

Error Responses:
    400 Bad Request: If required parameters are missing or invalid, or if group suggestion operations fail
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to manage group suggestions
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Requires IsDMAdmin, IsPlatformAdmin, or IsDepartmentModeAdminInPlatform permission
    - Platform admins can manage group suggestions for their platform
    - Department admins can manage group suggestions for their departments
    - DM admins can manage all group suggestions

# paths./api/catalog/suggestions/pathway/manage/group/.post.parameters[].description
Filter suggestions by department admin access

# paths./api/catalog/suggestions/pathway/manage/group/.post.parameters[].description
The platform to retrieve group suggestions for

# paths./api/catalog/suggestions/pathway/manage/group/.post.parameters[].description
The organization identifier for the platform

# paths./api/catalog/suggestions/pathway/manage/group/.post.responses.400.description
Bad request - required parameters missing or invalid

# paths./api/catalog/suggestions/pathway/manage/group/.delete.description
API View for managing pathway group suggestions.

This endpoint allows administrators to view, create, and delete pathway suggestions
for groups of users within a platform.

Query Parameters (GET):
    platform_key (str, required): The platform to retrieve group suggestions for
    platform_org (str, optional): The organization identifier for the platform
    query (str, optional): Search term to filter group suggestions
    sort (str, optional): Field to sort results by (default: 'id')
    department_mode (bool, optional): Filter suggestions by department admin access
    page (int, optional): Page number for pagination
    page_size (int, optional): Number of items per page

Methods:
    GET: Retrieve a paginated list of pathway group suggestions for a platform
    POST: Create or update a pathway group suggestion
    DELETE: Remove a pathway group suggestion

Request Body (POST):
    A JSON object containing:
    - platform_key (str, required): The platform for the group suggestion
    - pathway_id (str, required): The pathway ID to suggest
    - group_id (str/int, required): The group to suggest the pathway to
    - accepted (bool, optional): Whether the suggestion is accepted
    - visible (bool, optional): Whether the suggestion is visible
    - metadata (dict, optional): Additional suggestion metadata

Query Parameters (DELETE):
    suggestion_id (int, required): The ID of the group suggestion to delete

Returns:
    GET: A paginated JSON response containing pathway group suggestions:
        {
            "count": 5,
            "next": "https://example.com/api/catalog/suggestions/pathway/group/?page=2",
            "previous": null,
            "results": [
                {
                    "id": 123,
                    "group_id": 789,
                    "group_name": "Engineering Team",
                    "platform_key": "platform1",
                    "accepted": false,
                    "visible": true,
                    "created": "2023-06-15T14:30:00Z",
                    "modified": "2023-06-15T14:30:00Z",
                    "metadata": {},
                    "pathway_id": "pathway-v1:org+pathway+run",
                    "pathway_uuid": "12345678-1234-5678-1234-567812345678",
                    "pathway_name": "Data Science Pathway",
                    "pathway_platform_key": "platform1",
                    "user_count": 25
                },
                ...
            ]
        }

    POST: A JSON response containing the created/updated group suggestion:
        {
            "id": 123,
            "group_id": 789,
            "group_name": "Engineering Team",
            "platform_key": "platform1",
            "accepted": false,
            "visible": true,
            "created": "2023-06-15T14:30:00Z",
            "modified": "2023-06-15T14:30:00Z",
            "metadata": {},
            "pathway_id": "pathway-v1:org+pathway+run",
            "pathway_uuid": "12345678-1234-5678-1234-567812345678",
            "pathway_name": "Data Science Pathway",
            "pathway_platform_key": "platform1",
            "user_count": 25
        }

    DELETE: A success response with status 200

Error Responses:
    400 Bad Request: If required parameters are missing or invalid, or if group suggestion operations fail
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to manage group suggestions
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Requires IsDMAdmin, IsPlatformAdmin, or IsDepartmentModeAdminInPlatform permission
    - Platform admins can manage group suggestions for their platform
    - Department admins can manage group suggestions for their departments
    - DM admins can manage all group suggestions

# paths./api/catalog/suggestions/pathway/manage/group/.delete.parameters[].description
Flag to ensure department admins can call the API

# paths./api/catalog/suggestions/pathway/manage/group/.delete.parameters[].description
The platform to retrieve group suggestions for

# paths./api/catalog/suggestions/pathway/manage/group/.delete.parameters[].description
The organization identifier for the platform

# paths./api/catalog/suggestions/pathway/manage/group/.delete.parameters[].description
The ID of the group suggestion to delete

# paths./api/catalog/suggestions/pathway/manage/group/.delete.responses.400.description
Bad request - required parameters missing or invalid

# paths./api/catalog/suggestions/pathway/manage/group/.delete.responses.404.description
Not found - group suggestion does not exist

# paths./api/catalog/suggestions/pathway/user/.get.description
API View for retrieving pathway suggestions for a specific user.

This endpoint allows users to view pathway suggestions that have been made for them,
with support for filtering by platform and pagination.

Query Parameters:
    user (str, required): Username or user ID to retrieve suggestions for
    platform_key (str, optional): Filter suggestions by platform key
    platform_org (str, optional): Filter suggestions by platform organization
    sort (str, optional): Field to sort results by (default: '-id')
    page (int, optional): Page number for pagination
    page_size (int, optional): Number of items per page

Methods:
    GET: Retrieve a paginated list of pathway suggestions for a user

Returns:
    GET: A paginated JSON response containing pathway suggestions:
        {
            "count": 10,
            "next": "https://example.com/api/catalog/suggestions/pathway/user/?page=2",
            "previous": null,
            "results": [
                {
                    "id": 123,
                    "user_id": 456,
                    "username": "student1",
                    "name": "Student Name",
                    "platform_key": "platform1",
                    "accepted": false,
                    "visible": true,
                    "created": "2023-06-15T14:30:00Z",
                    "modified": "2023-06-15T14:30:00Z",
                    "metadata": {},
                    "pathway_id": "pathway-v1:org+pathway+run",
                    "pathway_uuid": "12345678-1234-5678-1234-567812345678",
                    "pathway_name": "Data Science Pathway",
                    "pathway_platform_key": "platform1"
                },
                ...
            ]
        }

Error Responses:
    400 Bad Request: If required parameters are missing or invalid, or if suggestion retrieval fails
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to access this resource
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Requires IsDMAdmin, IsPlatformAdminReadOnly, or IsEdxUserReadOnly permission
    - Users can view their own suggestions
    - Platform admins can view suggestions for users in their platform (read-only)
    - DM admins can view all suggestions

# paths./api/catalog/suggestions/pathway/user/.get.parameters[].description
Filter suggestions by platform organization

# paths./api/catalog/suggestions/pathway/user/.get.parameters[].description
Username or user ID to retrieve suggestions for

# paths./api/catalog/suggestions/pathway/user/.get.responses.400.description
Bad request - required parameters missing or invalid

# paths./api/catalog/suggestions/program/manage/.get.description
API View for managing program suggestions.

This endpoint allows administrators to view, create, update, and delete program suggestions
for users within a platform.

Query Parameters (GET):
    platform_key (str, required): The platform to retrieve suggestions for
    platform_org (str, optional): The organization identifier for the platform
    query (str, optional): Search term to filter suggestions
    sort (str, optional): Field to sort results by (default: '-id')
    department_mode (bool, optional): Filter suggestions by department admin access
    page (int, optional): Page number for pagination
    page_size (int, optional): Number of items per page

Methods:
    GET: Retrieve a paginated list of program suggestions for a platform
    POST: Create or update a program suggestion
    DELETE: Remove a program suggestion

Request Body (POST):
    A JSON object containing:
    - platform_key (str, required): The platform for the suggestion
    - program_key (str, required): The program key to suggest
    - user_id (str/int, required): The user to suggest the program to
    - accepted (bool, optional): Whether the suggestion is accepted
    - visible (bool, optional): Whether the suggestion is visible
    - metadata (dict, optional): Additional suggestion metadata

Query Parameters (DELETE):
    suggestion_id (int, required): The ID of the suggestion to delete

Returns:
    GET: A paginated JSON response containing program suggestions:
        {
            "count": 10,
            "next": "https://example.com/api/catalog/suggestions/program/manage/?page=2",
            "previous": null,
            "results": [
                {
                    "id": 123,
                    "user_id": 456,
                    "username": "student1",
                    "name": "Student Name",
                    "platform_key": "platform1",
                    "accepted": false,
                    "visible": true,
                    "created": "2023-06-15T14:30:00Z",
                    "modified": "2023-06-15T14:30:00Z",
                    "metadata": {},
                    "program_key": "program-v1:org+program+run",
                    "program_name": "Data Science Program"
                },
                ...
            ]
        }

    POST: A JSON response containing the created/updated suggestion:
        {
            "id": 123,
            "user_id": 456,
            "username": "student1",
            "name": "Student Name",
            "platform_key": "platform1",
            "accepted": false,
            "visible": true,
            "created": "2023-06-15T14:30:00Z",
            "modified": "2023-06-15T14:30:00Z",
            "metadata": {},
            "program_key": "program-v1:org+program+run",
            "program_name": "Data Science Program"
        }

    DELETE: A success response with status 200

Error Responses:
    400 Bad Request: If required parameters are missing or invalid, or if suggestion operations fail
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to manage suggestions
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Requires IsDMAdmin, IsPlatformAdmin, or IsDepartmentModeAdminInPlatform permission
    - Platform admins can manage suggestions for their platform
    - Department admins can manage suggestions for their departments
    - DM admins can manage all suggestions

# paths./api/catalog/suggestions/program/manage/.get.parameters[].description
Filter suggestions by department admin access

# paths./api/catalog/suggestions/program/manage/.get.parameters[].description
The platform to retrieve suggestions for

# paths./api/catalog/suggestions/program/manage/.get.parameters[].description
The organization identifier for the platform

# paths./api/catalog/suggestions/program/manage/.get.responses.400.description
Bad request - required parameters missing or invalid

# paths./api/catalog/suggestions/program/manage/.post.description
API View for managing program suggestions.

This endpoint allows administrators to view, create, update, and delete program suggestions
for users within a platform.

Query Parameters (GET):
    platform_key (str, required): The platform to retrieve suggestions for
    platform_org (str, optional): The organization identifier for the platform
    query (str, optional): Search term to filter suggestions
    sort (str, optional): Field to sort results by (default: '-id')
    department_mode (bool, optional): Filter suggestions by department admin access
    page (int, optional): Page number for pagination
    page_size (int, optional): Number of items per page

Methods:
    GET: Retrieve a paginated list of program suggestions for a platform
    POST: Create or update a program suggestion
    DELETE: Remove a program suggestion

Request Body (POST):
    A JSON object containing:
    - platform_key (str, required): The platform for the suggestion
    - program_key (str, required): The program key to suggest
    - user_id (str/int, required): The user to suggest the program to
    - accepted (bool, optional): Whether the suggestion is accepted
    - visible (bool, optional): Whether the suggestion is visible
    - metadata (dict, optional): Additional suggestion metadata

Query Parameters (DELETE):
    suggestion_id (int, required): The ID of the suggestion to delete

Returns:
    GET: A paginated JSON response containing program suggestions:
        {
            "count": 10,
            "next": "https://example.com/api/catalog/suggestions/program/manage/?page=2",
            "previous": null,
            "results": [
                {
                    "id": 123,
                    "user_id": 456,
                    "username": "student1",
                    "name": "Student Name",
                    "platform_key": "platform1",
                    "accepted": false,
                    "visible": true,
                    "created": "2023-06-15T14:30:00Z",
                    "modified": "2023-06-15T14:30:00Z",
                    "metadata": {},
                    "program_key": "program-v1:org+program+run",
                    "program_name": "Data Science Program"
                },
                ...
            ]
        }

    POST: A JSON response containing the created/updated suggestion:
        {
            "id": 123,
            "user_id": 456,
            "username": "student1",
            "name": "Student Name",
            "platform_key": "platform1",
            "accepted": false,
            "visible": true,
            "created": "2023-06-15T14:30:00Z",
            "modified": "2023-06-15T14:30:00Z",
            "metadata": {},
            "program_key": "program-v1:org+program+run",
            "program_name": "Data Science Program"
        }

    DELETE: A success response with status 200

Error Responses:
    400 Bad Request: If required parameters are missing or invalid, or if suggestion operations fail
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to manage suggestions
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Requires IsDMAdmin, IsPlatformAdmin, or IsDepartmentModeAdminInPlatform permission
    - Platform admins can manage suggestions for their platform
    - Department admins can manage suggestions for their departments
    - DM admins can manage all suggestions

# paths./api/catalog/suggestions/program/manage/.post.parameters[].description
Filter suggestions by department admin access

# paths./api/catalog/suggestions/program/manage/.post.parameters[].description
The platform to retrieve suggestions for

# paths./api/catalog/suggestions/program/manage/.post.parameters[].description
The organization identifier for the platform

# paths./api/catalog/suggestions/program/manage/.post.responses.400.description
Bad request - required parameters missing or invalid

# paths./api/catalog/suggestions/program/manage/.delete.description
API View for managing program suggestions.

This endpoint allows administrators to view, create, update, and delete program suggestions
for users within a platform.

Query Parameters (GET):
    platform_key (str, required): The platform to retrieve suggestions for
    platform_org (str, optional): The organization identifier for the platform
    query (str, optional): Search term to filter suggestions
    sort (str, optional): Field to sort results by (default: '-id')
    department_mode (bool, optional): Filter suggestions by department admin access
    page (int, optional): Page number for pagination
    page_size (int, optional): Number of items per page

Methods:
    GET: Retrieve a paginated list of program suggestions for a platform
    POST: Create or update a program suggestion
    DELETE: Remove a program suggestion

Request Body (POST):
    A JSON object containing:
    - platform_key (str, required): The platform for the suggestion
    - program_key (str, required): The program key to suggest
    - user_id (str/int, required): The user to suggest the program to
    - accepted (bool, optional): Whether the suggestion is accepted
    - visible (bool, optional): Whether the suggestion is visible
    - metadata (dict, optional): Additional suggestion metadata

Query Parameters (DELETE):
    suggestion_id (int, required): The ID of the suggestion to delete

Returns:
    GET: A paginated JSON response containing program suggestions:
        {
            "count": 10,
            "next": "https://example.com/api/catalog/suggestions/program/manage/?page=2",
            "previous": null,
            "results": [
                {
                    "id": 123,
                    "user_id": 456,
                    "username": "student1",
                    "name": "Student Name",
                    "platform_key": "platform1",
                    "accepted": false,
                    "visible": true,
                    "created": "2023-06-15T14:30:00Z",
                    "modified": "2023-06-15T14:30:00Z",
                    "metadata": {},
                    "program_key": "program-v1:org+program+run",
                    "program_name": "Data Science Program"
                },
                ...
            ]
        }

    POST: A JSON response containing the created/updated suggestion:
        {
            "id": 123,
            "user_id": 456,
            "username": "student1",
            "name": "Student Name",
            "platform_key": "platform1",
            "accepted": false,
            "visible": true,
            "created": "2023-06-15T14:30:00Z",
            "modified": "2023-06-15T14:30:00Z",
            "metadata": {},
            "program_key": "program-v1:org+program+run",
            "program_name": "Data Science Program"
        }

    DELETE: A success response with status 200

Error Responses:
    400 Bad Request: If required parameters are missing or invalid, or if suggestion operations fail
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to manage suggestions
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Requires IsDMAdmin, IsPlatformAdmin, or IsDepartmentModeAdminInPlatform permission
    - Platform admins can manage suggestions for their platform
    - Department admins can manage suggestions for their departments
    - DM admins can manage all suggestions

# paths./api/catalog/suggestions/program/manage/.delete.parameters[].description
Filter suggestions by department admin access

# paths./api/catalog/suggestions/program/manage/.delete.parameters[].description
The platform to delete the suggestion from

# paths./api/catalog/suggestions/program/manage/.delete.parameters[].description
The organization identifier for the platform

# paths./api/catalog/suggestions/program/manage/.delete.responses.400.description
Bad request - required parameters missing or invalid

# paths./api/catalog/suggestions/program/manage/bulk/.post.description
API View for bulk creation of program suggestions.

This endpoint allows administrators to create multiple program suggestions at once.

Methods:
    POST: Create multiple program suggestions in bulk

Request Body:
    A JSON object containing:
    - platform_key (str, required): The platform for the suggestions
    - suggestion_data (array, required): Array of suggestion objects with:
      - program_key (str, required): The program key to suggest
      - user_id (str/int, required): The user to suggest the program to
      - accepted (bool, optional): Whether the suggestion is accepted
      - visible (bool, optional): Whether the suggestion is visible
      - metadata (dict, optional): Additional suggestion metadata

Returns:
    POST: A JSON response containing the results of the bulk operation:
        {
            "successes": 15,
            "error_codes": []
        }

Error Responses:
    400 Bad Request: If required parameters are missing or invalid
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to create suggestions
    500 Internal Server Error: If an unexpected error occurs during bulk creation

Access Control:
    - Requires IsDMAdmin, IsPlatformAdmin, or IsDepartmentModeAdminInPlatform permission
    - Platform admins can create suggestions for their platform
    - Department admins can create suggestions for their departments
    - DM admins can create suggestions for all platforms

# paths./api/catalog/suggestions/program/manage/bulk/.post.responses.400.description
Bad request - required parameters missing or invalid

# paths./api/catalog/suggestions/program/manage/group/.get.description
API View for managing program group suggestions.

This endpoint allows administrators to view, create, and delete program suggestions
for groups of users within a platform.

Query Parameters (GET):
    platform_key (str, required): The platform to retrieve group suggestions for
    platform_org (str, optional): The organization identifier for the platform
    query (str, optional): Search term to filter group suggestions
    sort (str, optional): Field to sort results by (default: 'id')
    department_mode (bool, optional): Filter suggestions by department admin access
    page (int, optional): Page number for pagination
    page_size (int, optional): Number of items per page

Methods:
    GET: Retrieve a paginated list of program group suggestions for a platform
    POST: Create or update a program group suggestion
    DELETE: Remove a program group suggestion

Request Body (POST):
    A JSON object containing:
    - platform_key (str, required): The platform for the group suggestion
    - program_key (str, required): The program key to suggest
    - group_id (str/int, required): The group to suggest the program to
    - accepted (bool, optional): Whether the suggestion is accepted
    - visible (bool, optional): Whether the suggestion is visible
    - metadata (dict, optional): Additional suggestion metadata

Query Parameters (DELETE):
    suggestion_id (int, required): The ID of the group suggestion to delete

Returns:
    GET: A paginated JSON response containing program group suggestions:
        {
            "count": 5,
            "next": "https://example.com/api/catalog/suggestions/program/group/?page=2",
            "previous": null,
            "results": [
                {
                    "id": 123,
                    "group_id": 789,
                    "group_name": "Engineering Team",
                    "platform_key": "platform1",
                    "accepted": false,
                    "visible": true,
                    "created": "2023-06-15T14:30:00Z",
                    "modified": "2023-06-15T14:30:00Z",
                    "metadata": {},
                    "program_key": "program-v1:org+program+run",
                    "program_name": "Data Science Program",
                    "user_count": 25
                },
                ...
            ]
        }

    POST: A JSON response containing the created/updated group suggestion:
        {
            "id": 123,
            "group_id": 789,
            "group_name": "Engineering Team",
            "platform_key": "platform1",
            "accepted": false,
            "visible": true,
            "created": "2023-06-15T14:30:00Z",
            "modified": "2023-06-15T14:30:00Z",
            "metadata": {},
            "program_key": "program-v1:org+program+run",
            "program_name": "Data Science Program",
            "user_count": 25
        }

    DELETE: A success response with status 200

Error Responses:
    400 Bad Request: If required parameters are missing or invalid, or if group suggestion operations fail
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to manage group suggestions
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Requires IsDMAdmin, IsPlatformAdmin, or IsDepartmentModeAdminInPlatform permission
    - Platform admins can manage group suggestions for their platform
    - Department admins can manage group suggestions for their departments
    - DM admins can manage all group suggestions

# paths./api/catalog/suggestions/program/manage/group/.get.parameters[].description
Filter suggestions by department admin access

# paths./api/catalog/suggestions/program/manage/group/.get.parameters[].description
The platform to retrieve group suggestions for

# paths./api/catalog/suggestions/program/manage/group/.get.parameters[].description
The organization identifier for the platform

# paths./api/catalog/suggestions/program/manage/group/.get.responses.400.description
Bad request - required parameters missing or invalid

# paths./api/catalog/suggestions/program/manage/group/.post.description
API View for managing program group suggestions.

This endpoint allows administrators to view, create, and delete program suggestions
for groups of users within a platform.

Query Parameters (GET):
    platform_key (str, required): The platform to retrieve group suggestions for
    platform_org (str, optional): The organization identifier for the platform
    query (str, optional): Search term to filter group suggestions
    sort (str, optional): Field to sort results by (default: 'id')
    department_mode (bool, optional): Filter suggestions by department admin access
    page (int, optional): Page number for pagination
    page_size (int, optional): Number of items per page

Methods:
    GET: Retrieve a paginated list of program group suggestions for a platform
    POST: Create or update a program group suggestion
    DELETE: Remove a program group suggestion

Request Body (POST):
    A JSON object containing:
    - platform_key (str, required): The platform for the group suggestion
    - program_key (str, required): The program key to suggest
    - group_id (str/int, required): The group to suggest the program to
    - accepted (bool, optional): Whether the suggestion is accepted
    - visible (bool, optional): Whether the suggestion is visible
    - metadata (dict, optional): Additional suggestion metadata

Query Parameters (DELETE):
    suggestion_id (int, required): The ID of the group suggestion to delete

Returns:
    GET: A paginated JSON response containing program group suggestions:
        {
            "count": 5,
            "next": "https://example.com/api/catalog/suggestions/program/group/?page=2",
            "previous": null,
            "results": [
                {
                    "id": 123,
                    "group_id": 789,
                    "group_name": "Engineering Team",
                    "platform_key": "platform1",
                    "accepted": false,
                    "visible": true,
                    "created": "2023-06-15T14:30:00Z",
                    "modified": "2023-06-15T14:30:00Z",
                    "metadata": {},
                    "program_key": "program-v1:org+program+run",
                    "program_name": "Data Science Program",
                    "user_count": 25
                },
                ...
            ]
        }

    POST: A JSON response containing the created/updated group suggestion:
        {
            "id": 123,
            "group_id": 789,
            "group_name": "Engineering Team",
            "platform_key": "platform1",
            "accepted": false,
            "visible": true,
            "created": "2023-06-15T14:30:00Z",
            "modified": "2023-06-15T14:30:00Z",
            "metadata": {},
            "program_key": "program-v1:org+program+run",
            "program_name": "Data Science Program",
            "user_count": 25
        }

    DELETE: A success response with status 200

Error Responses:
    400 Bad Request: If required parameters are missing or invalid, or if group suggestion operations fail
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to manage group suggestions
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Requires IsDMAdmin, IsPlatformAdmin, or IsDepartmentModeAdminInPlatform permission
    - Platform admins can manage group suggestions for their platform
    - Department admins can manage group suggestions for their departments
    - DM admins can manage all group suggestions

# paths./api/catalog/suggestions/program/manage/group/.post.parameters[].description
Filter suggestions by department admin access

# paths./api/catalog/suggestions/program/manage/group/.post.parameters[].description
The platform to retrieve group suggestions for

# paths./api/catalog/suggestions/program/manage/group/.post.parameters[].description
The organization identifier for the platform

# paths./api/catalog/suggestions/program/manage/group/.post.responses.400.description
Bad request - required parameters missing or invalid

# paths./api/catalog/suggestions/program/manage/group/.delete.description
API View for managing program group suggestions.

This endpoint allows administrators to view, create, and delete program suggestions
for groups of users within a platform.

Query Parameters (GET):
    platform_key (str, required): The platform to retrieve group suggestions for
    platform_org (str, optional): The organization identifier for the platform
    query (str, optional): Search term to filter group suggestions
    sort (str, optional): Field to sort results by (default: 'id')
    department_mode (bool, optional): Filter suggestions by department admin access
    page (int, optional): Page number for pagination
    page_size (int, optional): Number of items per page

Methods:
    GET: Retrieve a paginated list of program group suggestions for a platform
    POST: Create or update a program group suggestion
    DELETE: Remove a program group suggestion

Request Body (POST):
    A JSON object containing:
    - platform_key (str, required): The platform for the group suggestion
    - program_key (str, required): The program key to suggest
    - group_id (str/int, required): The group to suggest the program to
    - accepted (bool, optional): Whether the suggestion is accepted
    - visible (bool, optional): Whether the suggestion is visible
    - metadata (dict, optional): Additional suggestion metadata

Query Parameters (DELETE):
    suggestion_id (int, required): The ID of the group suggestion to delete

Returns:
    GET: A paginated JSON response containing program group suggestions:
        {
            "count": 5,
            "next": "https://example.com/api/catalog/suggestions/program/group/?page=2",
            "previous": null,
            "results": [
                {
                    "id": 123,
                    "group_id": 789,
                    "group_name": "Engineering Team",
                    "platform_key": "platform1",
                    "accepted": false,
                    "visible": true,
                    "created": "2023-06-15T14:30:00Z",
                    "modified": "2023-06-15T14:30:00Z",
                    "metadata": {},
                    "program_key": "program-v1:org+program+run",
                    "program_name": "Data Science Program",
                    "user_count": 25
                },
                ...
            ]
        }

    POST: A JSON response containing the created/updated group suggestion:
        {
            "id": 123,
            "group_id": 789,
            "group_name": "Engineering Team",
            "platform_key": "platform1",
            "accepted": false,
            "visible": true,
            "created": "2023-06-15T14:30:00Z",
            "modified": "2023-06-15T14:30:00Z",
            "metadata": {},
            "program_key": "program-v1:org+program+run",
            "program_name": "Data Science Program",
            "user_count": 25
        }

    DELETE: A success response with status 200

Error Responses:
    400 Bad Request: If required parameters are missing or invalid, or if group suggestion operations fail
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to manage group suggestions
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Requires IsDMAdmin, IsPlatformAdmin, or IsDepartmentModeAdminInPlatform permission
    - Platform admins can manage group suggestions for their platform
    - Department admins can manage group suggestions for their departments
    - DM admins can manage all group suggestions

# paths./api/catalog/suggestions/program/manage/group/.delete.parameters[].description
Flag to ensure department admins can call the API

# paths./api/catalog/suggestions/program/manage/group/.delete.parameters[].description
The platform to retrieve group suggestions for

# paths./api/catalog/suggestions/program/manage/group/.delete.parameters[].description
The organization identifier for the platform

# paths./api/catalog/suggestions/program/manage/group/.delete.parameters[].description
The ID of the group suggestion to delete

# paths./api/catalog/suggestions/program/manage/group/.delete.responses.400.description
Bad request - required parameters missing or invalid

# paths./api/catalog/suggestions/program/manage/group/.delete.responses.404.description
Not found - group suggestion does not exist

# paths./api/catalog/suggestions/program/user/.get.description
API View for retrieving program suggestions for a specific user.

This endpoint allows users to view program suggestions that have been made for them,
with support for filtering by platform and pagination.

Query Parameters:
    user (str, required): Username or user ID to retrieve suggestions for
    platform_key (str, optional): Filter suggestions by platform key
    platform_org (str, optional): Filter suggestions by platform organization
    sort (str, optional): Field to sort results by (default: '-id')
    page (int, optional): Page number for pagination
    page_size (int, optional): Number of items per page

Methods:
    GET: Retrieve a paginated list of program suggestions for a user

Returns:
    GET: A paginated JSON response containing program suggestions:
        {
            "count": 10,
            "next": "https://example.com/api/catalog/suggestions/program/user/?page=2",
            "previous": null,
            "results": [
                {
                    "id": 123,
                    "user_id": 456,
                    "username": "student1",
                    "name": "Student Name",
                    "platform_key": "platform1",
                    "accepted": false,
                    "visible": true,
                    "created": "2023-06-15T14:30:00Z",
                    "modified": "2023-06-15T14:30:00Z",
                    "metadata": {},
                    "program_key": "program-v1:org+program+run",
                    "program_name": "Data Science Program"
                },
                ...
            ]
        }

Error Responses:
    400 Bad Request: If required parameters are missing or invalid, or if suggestion retrieval fails
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to access this resource
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Requires IsDMAdmin, IsPlatformAdminReadOnly, or IsEdxUserReadOnly permission
    - Users can view their own suggestions
    - Platform admins can view suggestions for users in their platform (read-only)
    - DM admins can view all suggestions

# paths./api/catalog/suggestions/program/user/.get.parameters[].description
Filter suggestions by platform organization

# paths./api/catalog/suggestions/program/user/.get.parameters[].description
Username or user ID to retrieve suggestions for

# paths./api/catalog/suggestions/program/user/.get.responses.400.description
Bad request - required parameters missing or invalid

# paths./api/core/consolidated-token/provision/.post.description
Resolve-or-provision a user, then mint DM + AXD tokens.

Params:
- username: str (required)
- email: str (required)
- name: str (optional)
- platform_key: str (required)

# paths./api/core/consolidated-token/proxy/.post.description
Create DM and AXD Tokens for user and platform_key

Params:
- Any of user_id, username, or email (choose one only, required)
- platform_key: str (required)

# paths./api/core/departments/.get.description
Show (active) departments associated with a platform

# paths./api/core/departments/members/.get.description
Show active users in department (paginated)

# paths./api/core/departments/members/.post.description
Add single user to department, or update status

# paths./api/core/departments/members/bulk/.post.description
Add users to department, or update status

# paths./api/core/departments/members/check/.get.description
Get department member admin info of requesting user

# paths./api/core/heartbeat/celery/.get.description
**Use Case**

    Celery heartbeat endpoint.

**Example Request**

    GET /api/core/heartbeat/celery/

**Response Values**

    * 200 on success.
    * 500 on failure.

# paths./api/core/heartbeat/celery-beat/.get.description
**Use Case**

    Celery Beat heartbeat endpoint.

**Example Request**

    GET /api/core/heartbeat/celery-beat/

**Response Values**

    * 200 on success.
    * 500 on failure.

# paths./api/core/launcher/.get.description
GET Launch status

Params:
key
user_id: Optional

# paths./api/core/launcher/.post.description
POST: Launch a new edX platform

Params:
user_id: The ID of the requesting user (required)
key: The Deep LMS subdomain (required)
name: The edX platform name ("optional")
org: The edX organization ("optional")
lms_url: LMS URL ("optional")
cms_url: CMS URL ("optional")
portal_url: Portal URL ("optional")
use_default_hosts: Use Django settings for LMS/CMS hosts ("optional")

# paths./api/core/lti/1p3/provider/lti-keys/{id}/.get.description
Get details about a specific LTI Provider Key

# paths./api/core/orgs/{org}/redirect-tokens/.post.description
Creates redirect tokens for a URL specified by for a platform

# paths./api/core/orgs/{org}/redirect-tokens/{redirect_token}/.get.description
Returns Redirect URL for the token specified.

```
Requires user to be a member of the platform with the token passed
```

# paths./api/core/orgs/{org}/redirect-tokens/{redirect_token}/delete.delete.parameters[].description
Optional mentor unique ID for RBAC ownership check

# paths./api/core/platform/.get.description
GET /api/core/platform/
Get main platform info.

POST /api/core/platform/
Save main platform settings.

Params:
user_id (optional)
key
field_key (POST)
value (POST)

# paths./api/core/platform/.post.description
Update platform object

Params:
user_id

key
new_key (If changing platform key)
name

Advanced Params (Don't expose these to users)
lms_url
cms_url
portal_url

# paths./api/core/platform/api-tokens/.get.description
List Platform API Key's belonging to the target platform

# paths./api/core/platform/api-tokens/.get.parameters[].description
A page number within the paginated result set.

# paths./api/core/platform/api-tokens/.post.description
Create a new Platform Api Key for the target platform

# paths./api/core/platform/api-tokens/{name}.get.description
Retrieve a single Platform Api Key by name, including the policies and groups currently associated with it

# paths./api/core/platform/api-tokens/{name}.patch.description
Update a Platform Api Key's mode and associated policies/groups in the target platform

# paths./api/core/platform/api-tokens/{name}.delete.description
Delete Platform Api Key by name in the target platform

# paths./api/core/platform/api-tokens/field-permissions/.get.description
Per-field write permissions for the create form, as {field: {"write": bool}}. Gated on create access like the create endpoint.

# paths./api/core/platform/config/site/.get.description
GET /site
Get site settings.

POST /site
Save site settings.

Params:
user_id
key
field_key (POST)
value (POST)

# paths./api/core/platform/config/site/.post.description
GET /site
Get site settings.

POST /site
Save site settings.

Params:
user_id
key
field_key (POST)
value (POST)

# paths./api/core/platform/configurations/.get.description
Get all configuration values for a platform with proper type casting.

# paths./api/core/platform/configurations/.get.parameters[].description
Platform key to get/set configurations for

# paths./api/core/platform/configurations/.post.description
Set or update multiple platform configuration values.Values will be automatically normalized for storage and cast appropriately on retrieval.

# paths./api/core/platform/configurations/available-settings/.get.description
Get all available settings that can be configured with current platform values

# paths./api/core/platform/configurations/delete-config/.delete.description
Delete a specific platform configuration

Query Parameters:
- platform_key: Platform key
- key: Configuration key to delete

# paths./api/core/platform/configurations/public/.get.description
Get public platform configurations for platform members

Query Parameters:
- platform_key: Platform key to get public configurations for

Returns:
- platform_key: The platform key
- configurations: Dictionary of public config key-value pairs
- count: Number of public configurations returned

# paths./api/core/platform/users/.get.description
Retrieve users associated with platform and optionally their policies when return_policies is set

# paths./api/core/platform/users/.get.responses.200.content.application/json.examples.ResponseExample(withoutPolicies).summary
Example response when return_policies is not provided

# paths./api/core/platform/users/.get.responses.200.content.application/json.examples.ResponseExample(withPolicies).summary
Example response when return_policies is provided

# paths./api/core/platform/users/policies/.put.description
Bulk update user policies on a platform. Requires Ibl.Core/UserPolicies/write permission.

Policy removals are processed before policy additions.

# paths./api/core/platform/users/policies/.put.requestBody.content.application/json.examples.RequestExample-Add/Remove.summary
Example request using policies_to_add and policies_to_remove

# paths./api/core/platform/users/policies/.put.requestBody.content.application/json.examples.RequestExample-Set.summary
Example request using policies_to_set to replace all policies

# paths./api/core/platform/users/policies/.put.responses.200.content.application/json.examples.ResponseExample.summary
Example response showing user IDs mapped to their policies

# paths./api/core/platforms/{platform_key}/{username}/demographics/.get.description
Retrieve demographics for a user. Self-access or platform admin required.

# paths./api/core/platforms/{platform_key}/{username}/demographics/.put.description
Create or update demographics for a user. Self-access or platform admin required.

# paths./api/core/platforms/{platform_key}/{username}/demographics/.delete.description
Delete demographics for a user. Self-access or platform admin required.

# paths./api/core/platforms/{platform_key}/demographics/fields/.post.description
Create a custom demographics field definition for the platform.

# paths./api/core/platforms/{platform_key}/demographics/fields/{slug}/.get.parameters[].schema.description
URL-safe identifier used as the key in custom_fields payloads.

# paths./api/core/platforms/{platform_key}/demographics/fields/{slug}/.put.description
Update a custom demographics field definition.

# paths./api/core/platforms/{platform_key}/demographics/fields/{slug}/.put.parameters[].schema.description
URL-safe identifier used as the key in custom_fields payloads.

# paths./api/core/platforms/{platform_key}/demographics/fields/{slug}/.patch.description
Partially update a custom demographics field definition.

# paths./api/core/platforms/{platform_key}/demographics/fields/{slug}/.patch.parameters[].schema.description
URL-safe identifier used as the key in custom_fields payloads.

# paths./api/core/platforms/{platform_key}/demographics/fields/{slug}/.delete.parameters[].schema.description
URL-safe identifier used as the key in custom_fields payloads.

# paths./api/core/platforms/{platform_key}/demographics/fields/export/.get.description
Export all field definitions for the platform as JSON or CSV.

# paths./api/core/platforms/{platform_key}/demographics/fields/import/.post.description
Import field definitions from JSON or CSV file. Returns 207 on partial success.

# paths./api/core/platforms/{platform_key}/public-image-assets/.get.description
Shared functionality for platform public image asset views.

# paths./api/core/platforms/{platform_key}/public-image-assets/.post.description
Shared functionality for platform public image asset views.

# paths./api/core/platforms/{platform_key}/public-image-assets/{asset_id.get.description
Shared functionality for platform public image asset views.

# paths./api/core/platforms/{platform_key}/public-image-assets/{asset_id.put.description
Shared functionality for platform public image asset views.

# paths./api/core/platforms/{platform_key}/public-image-assets/{asset_id.patch.description
Shared functionality for platform public image asset views.

# paths./api/core/platforms/{platform_key}/public-image-assets/{asset_id.delete.description
Shared functionality for platform public image asset views.

# paths./api/core/platforms/{platform_key}/public-image-assets/{asset_id.get.description
Shared functionality for platform public image asset views.

# paths./api/core/rbac/actions/definitions/.get.description
Returns a flat dictionary of all available RBAC actions with descriptions and assignable resource paths

# paths./api/core/rbac/actions/tree/.get.description
Returns a hierarchical tree of all available RBAC actions

# paths./api/core/rbac/groups/.get.description
Retrieve a list of RBAC groups. Can be filtered by platform_key, owner, name, username, or email. Use include_users to control response payload.

# paths./api/core/rbac/groups/.get.parameters[].description
Filter groups by email (exact match, case-insensitive)

# paths./api/core/rbac/groups/.get.parameters[].description
Include user information in response (default: true)

# paths./api/core/rbac/groups/.get.parameters[].description
Filter groups by name (case-insensitive partial match)

# paths./api/core/rbac/groups/.get.parameters[].description
A page number within the paginated result set.

# paths./api/core/rbac/groups/.get.parameters[].description
Filter groups by username (exact match, case-insensitive)

# paths./api/core/rbac/groups/.get.responses.403.description
Permission denied - insufficient RBAC permissions

# paths./api/core/rbac/groups/.post.description
Create a new RBAC group for a platform. Users can be assigned during creation.

# paths./api/core/rbac/groups/.post.responses.400.description
Invalid input data. Common errors include:
- Users do not belong to the specified platform
- Invalid user IDs provided

# paths./api/core/rbac/groups/.post.responses.403.description
Permission denied - insufficient RBAC permissions

# paths./api/core/rbac/groups/{id}/.get.description
Retrieve details of a specific RBAC group including assigned users.

# paths./api/core/rbac/groups/{id}/.get.parameters[].description
A unique integer value identifying this RBAC Group.

# paths./api/core/rbac/groups/{id}/.get.responses.403.description
Permission denied - insufficient RBAC permissions

# paths./api/core/rbac/groups/{id}/.put.description
Update an existing RBAC group. Platform validation applies for user assignments. Cannot update internal system groups.

# paths./api/core/rbac/groups/{id}/.put.parameters[].description
A unique integer value identifying this RBAC Group.

# paths./api/core/rbac/groups/{id}/.put.responses.400.description
Invalid input data. Common errors include:
- Users do not belong to the specified platform
- Invalid user IDs provided

# paths./api/core/rbac/groups/{id}/.put.responses.403.description
Permission denied - insufficient RBAC permissions or attempting to edit internal system group

# paths./api/core/rbac/groups/{id}/.patch.description
Partially update an existing RBAC group. Platform validation applies for user assignments. Cannot update internal system groups.

# paths./api/core/rbac/groups/{id}/.patch.parameters[].description
A unique integer value identifying this RBAC Group.

# paths./api/core/rbac/groups/{id}/.patch.responses.400.description
Invalid input data. Common errors include:
- Users do not belong to the specified platform
- Invalid user IDs provided

# paths./api/core/rbac/groups/{id}/.patch.responses.403.description
Permission denied - insufficient RBAC permissions or attempting to edit internal system group

# paths./api/core/rbac/groups/{id}/.delete.description
Delete an RBAC group and all associated group role assignments. Cannot delete internal system groups.

# paths./api/core/rbac/groups/{id}/.delete.parameters[].description
A unique integer value identifying this RBAC Group.

# paths./api/core/rbac/groups/{id}/.delete.responses.403.description
Permission denied - insufficient RBAC permissions or attempting to delete internal system group

# paths./api/core/rbac/mentor-access/.get.description
Retrieve current access information for a specific mentor, including all groups and users that have access with their respective roles.

# paths./api/core/rbac/mentor-access/.get.parameters[].description
ID of the mentor to get access information for

# paths./api/core/rbac/mentor-access/.get.responses.403.description
Permission denied - ShareMentor permission required

# paths./api/core/rbac/mentor-access/.post.description
Create or update RBAC policies to manage group and user access to specific mentors. Creates role-specific policies and handles adding/removing groups and users.

# paths./api/core/rbac/mentor-access/.post.summary
Control which RbacGroups and/or Users have access to a mentor and with what Role

# paths./api/core/rbac/mentor-access/.post.responses.400.description
Invalid request data or validation errors

# paths./api/core/rbac/mentor-access/.post.responses.403.description
Permission denied - ShareMentor permission required

# paths./api/core/rbac/permissions/check/.post.description
Check user permissions for specified resources

# paths./api/core/rbac/policies/.get.description
Retrieve a list of RBAC policies. Can be filtered by platform_key, role_id, name, username, email, or group. Use include_users and include_groups to control response payload.

# paths./api/core/rbac/policies/.get.parameters[].description
Filter policies by email (exact match, case-insensitive) - includes users in policy or in policy's groups

# paths./api/core/rbac/policies/.get.parameters[].description
Filter policies by group name (exact match, case-insensitive)

# paths./api/core/rbac/policies/.get.parameters[].description
Include group information in response (default: true)

# paths./api/core/rbac/policies/.get.parameters[].description
Include user information in response (default: true)

# paths./api/core/rbac/policies/.get.parameters[].description
Filter policies by name (case-insensitive partial match)

# paths./api/core/rbac/policies/.get.parameters[].description
A page number within the paginated result set.

# paths./api/core/rbac/policies/.get.parameters[].description
Filter policies by username (exact match, case-insensitive) - includes users in policy or in policy's groups

# paths./api/core/rbac/policies/.get.responses.403.description
Permission denied - insufficient RBAC permissions

# paths./api/core/rbac/policies/.post.description
Create a new RBAC policy that defines resource access for a role

# paths./api/core/rbac/policies/.post.responses.400.description
Invalid input data. Common errors include: invalid user/group IDs, users/groups not belonging to the platform, or invalid resource paths.

# paths./api/core/rbac/policies/.post.responses.403.description
Permission denied - insufficient RBAC permissions

# paths./api/core/rbac/policies/{id}/.get.description
Retrieve details of a specific RBAC policy, including role, platform, resources, users, and groups.

# paths./api/core/rbac/policies/{id}/.get.parameters[].description
A unique integer value identifying this RBAC Policy.

# paths./api/core/rbac/policies/{id}/.get.responses.403.description
Permission denied - insufficient RBAC permissions

# paths./api/core/rbac/policies/{id}/.put.parameters[].description
A unique integer value identifying this RBAC Policy.

# paths./api/core/rbac/policies/{id}/.put.responses.400.description
Invalid input data. Common errors include: invalid user/group IDs, users/groups not belonging to the platform, or invalid resource paths.

# paths./api/core/rbac/policies/{id}/.put.responses.403.description
Permission denied - insufficient RBAC permissions

# paths./api/core/rbac/policies/{id}/.patch.description
Partially update an existing RBAC policy. Only provided fields will be updated.

# paths./api/core/rbac/policies/{id}/.patch.parameters[].description
A unique integer value identifying this RBAC Policy.

# paths./api/core/rbac/policies/{id}/.patch.responses.400.description
Invalid input data. Common errors include: invalid user/group IDs, users/groups not belonging to the platform, or invalid resource paths.

# paths./api/core/rbac/policies/{id}/.patch.responses.403.description
Permission denied - insufficient RBAC permissions

# paths./api/core/rbac/policies/{id}/.delete.parameters[].description
A unique integer value identifying this RBAC Policy.

# paths./api/core/rbac/policies/{id}/.delete.responses.403.description
Permission denied - insufficient RBAC permissions

# paths./api/core/rbac/roles/.get.description
Retrieve a list of RBAC roles. Can be filtered by platform_key and name.

# paths./api/core/rbac/roles/.get.parameters[].description
Filter roles by name (case-insensitive partial match)

# paths./api/core/rbac/roles/.get.parameters[].description
A page number within the paginated result set.

# paths./api/core/rbac/roles/.get.responses.403.description
Permission denied - insufficient RBAC permissions

# paths./api/core/rbac/roles/.post.responses.403.description
Permission denied - insufficient RBAC permissions

# paths./api/core/rbac/roles/{id}/.get.description
Retrieve details of a specific RBAC role.

# paths./api/core/rbac/roles/{id}/.get.parameters[].description
A unique integer value identifying this RBAC Role.

# paths./api/core/rbac/roles/{id}/.get.responses.403.description
Permission denied - insufficient RBAC permissions

# paths./api/core/rbac/roles/{id}/.put.parameters[].description
A unique integer value identifying this RBAC Role.

# paths./api/core/rbac/roles/{id}/.put.responses.403.description
Permission denied - insufficient RBAC permissions

# paths./api/core/rbac/roles/{id}/.patch.parameters[].description
A unique integer value identifying this RBAC Role.

# paths./api/core/rbac/roles/{id}/.patch.responses.403.description
Permission denied - insufficient RBAC permissions

# paths./api/core/rbac/roles/{id}/.delete.description
Delete an RBAC role. WARNING: Deleting a role will remove all policies referencing it.

# paths./api/core/rbac/roles/{id}/.delete.parameters[].description
A unique integer value identifying this RBAC Role.

# paths./api/core/rbac/roles/{id}/.delete.responses.403.description
Permission denied - insufficient RBAC permissions

# paths./api/core/rbac/student-llm-access/set/.post.description
Configure which LLM resources students can access on a platform by replacing the LLM Users policy resources

# paths./api/core/rbac/student-llm-access/set/.post.responses.403.description
Permission denied - Tenant Admin access required

# paths./api/core/rbac/student-llm-access/status/.get.description
Check which LLM resources students are currently allowed to access on a platform

# paths./api/core/rbac/student-llm-access/status/.get.responses.403.description
Permission denied - Tenant Admin access required

# paths./api/core/rbac/student-mentor-creation/set/.post.description
Enable or disable the ability for students to create mentors on a platform

# paths./api/core/rbac/student-mentor-creation/set/.post.responses.403.description
Permission denied - Tenant Admin access required

# paths./api/core/rbac/student-mentor-creation/set/.post.responses.404.description
Platform, students group, or mentor creators policy not found

# paths./api/core/rbac/student-mentor-creation/status/.get.description
Check whether students are currently allowed to create mentors on a platform

# paths./api/core/rbac/student-mentor-creation/status/.get.summary
Get student mentor creation permission status

# paths./api/core/rbac/student-mentor-creation/status/.get.responses.403.description
Permission denied - Tenant Admin access required

# paths./api/core/rbac/teams/access/.get.description
Retrieve current access information for a specific usergroup, including all groups and users that have access with their respective roles.

# paths./api/core/rbac/teams/access/.get.parameters[].description
Platform key where the usergroup belongs

# paths./api/core/rbac/teams/access/.get.parameters[].description
ID of the usergroup to get access information for

# paths./api/core/rbac/teams/access/.get.responses.403.description
Permission denied - ShareUserGroups permission required

# paths./api/core/rbac/teams/access/.post.description
Create or update RBAC policies to manage group and user access to specific UserGroups (teams). Creates role-specific policies and handles adding/removing groups and users. Automatically adds users/groups to appropriate secondary policies as needed.

# paths./api/core/rbac/teams/access/.post.summary
Control which RbacGroups and/or Users have access to a UserGroup (team) and with what Role

# paths./api/core/rbac/teams/access/.post.responses.400.description
Invalid request data or validation errors

# paths./api/core/rbac/teams/access/.post.responses.403.description
Permission denied - ShareUserGroups permission required

# paths./api/core/rbac/user-group-access/.get.description
Retrieve current group access information for a specific user, including all groups the user has access to and whether they have mentor management permissions.

# paths./api/core/rbac/user-group-access/.get.parameters[].description
ID of the user to check group access for

# paths./api/core/rbac/user-group-access/.post.description
Create or update user access to groups by adding/removing group access. Creates one policy per user with GROUP_MENTOR_MANAGER role for managing mentor access.

# paths./api/core/rbac/user-group-access/.post.responses.400.description
Invalid request data or validation errors

# paths./api/core/session/logout/.post.description
Invalidate all tokens for the authenticated user

# paths./api/core/user-groups/.get.description
Retrieve a list of UserGroups. Can be filtered by platform_key, name, and include_users.

# paths./api/core/user-groups/.get.parameters[].description
Include user information in response (default: false for performance)

# paths./api/core/user-groups/.get.parameters[].description
A page number within the paginated result set.

# paths./api/core/user-groups/.get.parameters[].description
Return user groups (teams) you have this action on

# paths./api/core/user-groups/.get.parameters[].description
Include object-level permissions in response

# paths./api/core/user-groups/.post.description
Create a new UserGroup for a platform. Users can be assigned during creation.

# paths./api/core/user-groups/.post.responses.400.description
Invalid input data. Common errors include:
- Users do not belong to the specified platform
- Invalid user IDs provided

# paths./api/core/user-groups/{id}/.get.description
Retrieve details of a specific UserGroup including assigned users.

# paths./api/core/user-groups/{id}/.get.parameters[].description
A unique integer value identifying this User Group.

# paths./api/core/user-groups/{id}/.put.description
Update an existing UserGroup. Platform validation applies for user assignments.

# paths./api/core/user-groups/{id}/.put.parameters[].description
A unique integer value identifying this User Group.

# paths./api/core/user-groups/{id}/.put.responses.400.description
Invalid input data. Common errors include:
- Users do not belong to the specified platform
- Invalid user IDs provided

# paths./api/core/user-groups/{id}/.patch.description
Partially update an existing UserGroup. Platform validation applies for user assignments.

# paths./api/core/user-groups/{id}/.patch.parameters[].description
A unique integer value identifying this User Group.

# paths./api/core/user-groups/{id}/.patch.responses.400.description
Invalid input data. Common errors include:
- Users do not belong to the specified platform
- Invalid user IDs provided

# paths./api/core/user-groups/{id}/.delete.description
Delete a UserGroup and all associated user group links.

# paths./api/core/user-groups/{id}/.delete.parameters[].description
A unique integer value identifying this User Group.

# paths./api/core/user_groups/.get.description
Show (active) user groups associated with a platform

# paths./api/core/user_groups/link/.get.description
Show active users in user group (paginated)

group_id is numeric ID of group

# paths./api/core/user_groups/link/.post.description
Add single user to user group, or update status

# paths./api/core/user_groups/link/bulk/.post.description
Add users to user group, or update status

# paths./api/core/users/delete/.post.description
Initiates the account deletion process for the authenticated user or specified username.

# paths./api/core/users/metadata/proxy/.get.description
Get detailed user information.

Make permission check for platform admins here,
then proxy request to edx.

# paths./api/core/users/platform-metadata/.get.parameters[].description
Target user (admin only, defaults to self)

# paths./api/core/users/platform-metadata/.put.parameters[].description
Target user (admin only, defaults to self)

# paths./api/core/users/platform-metadata/.patch.description
Partial update of user platform metadata (merge keys, delete keys).

# paths./api/core/users/platform-metadata/.patch.parameters[].description
Target user (admin only, defaults to self)

# paths./api/core/users/platform-metadata/.delete.parameters[].description
Target user (admin only, defaults to self)

# paths./api/core/users/platforms/.get.description
Retrieve platforms associated with user_id

Params:
user_id
username
email

# paths./api/core/users/platforms/.post.description
Explicitly link platform to user_id

Params:
user_id
platform_key
added_on (optional)
expired_on (optional)
is_admin (optional)
active (optional)

# paths./api/core/users/platforms/config/.get.description
Get platform self-linking configuration

Params:
platform_key: The key of the platform to get configuration for

# paths./api/core/users/platforms/config/.post.description
Set platform self-linking configuration

Params:
platform_key: The key of the platform to configure
allow_self_linking: Whether to allow self-linking for this platform

# paths./api/core/users/platforms/config/public/.get.description
Anonymous read of public per-platform membership config.

Query params:
    platform_key: The key of the platform to look up.

# paths./api/core/users/platforms/default/.get.description
Return the authenticated user's default platform (or nulls).

# paths./api/core/users/platforms/default/.post.description
Set (upsert) the authenticated user's default platform.

A user may only set *their own* default, and only to a platform they
are actively linked to.

Params:
platform_key: The key of the platform to make the default

# paths./api/core/users/platforms/self-link/.post.description
Allow authenticated users to self-link to platforms that have self-linking enabled

Params:
platform_key: The key of the platform to link to

# paths./api/core/users/proxy/.get.description
Retrieve proxy user information by user_id

# paths./api/core/users/proxy/.post.description
Add proxy user

Params:
user_id
username
email
edx_data
data

# paths./api/core/users/proxy/bulk/.post.description
Add proxy users by bulk

Params:
users: list of user objects
```
[
    {"user_id": 1, ...},
    {"user_id": 2, ...}
]
```

# paths./api/core/users/search/.get.description
Retrieve users based on query
Not intended for public use with multitenant platforms

Params:
query
sort

# paths./api/core/watched-groups/.get.description
CRUD for WatchedGroup. Watcher mutations live on the nested /watchers/ endpoint;
POST here accepts an optional `watchers` array as a create-time convenience.

# paths./api/core/watched-groups/.get.summary
List watched groups visible to the caller

# paths./api/core/watched-groups/.get.parameters[].description
The initial index from which to return the results.

# paths./api/core/watched-groups/.get.parameters[].description
Service-account only: target platform key. Non-SA callers' platform is sourced from the auth token and this is ignored.

# paths./api/core/watched-groups/.post.description
CRUD for WatchedGroup. Watcher mutations live on the nested /watchers/ endpoint;
POST here accepts an optional `watchers` array as a create-time convenience.

# paths./api/core/watched-groups/.post.parameters[].description
Service-account only: target platform key. Non-SA callers' platform is sourced from the auth token and this is ignored.

# paths./api/core/watched-groups/.post.parameters[].description
Inline up to N watched users in the response (0 = none, max 100). Use the nested /watched-users/ endpoint for paginated walks.

# paths./api/core/watched-groups/.post.parameters[].description
Inline up to N watchers in the response (0 = none, max 100). Use the nested /watchers/ endpoint for paginated walks.

# paths./api/core/watched-groups/{id}/.get.description
CRUD for WatchedGroup. Watcher mutations live on the nested /watchers/ endpoint;
POST here accepts an optional `watchers` array as a create-time convenience.

# paths./api/core/watched-groups/{id}/.get.parameters[].description
A unique integer value identifying this Watched Group.

# paths./api/core/watched-groups/{id}/.get.parameters[].description
Service-account only: target platform key. Non-SA callers' platform is sourced from the auth token and this is ignored.

# paths./api/core/watched-groups/{id}/.get.parameters[].description
Inline up to N watched users in the response (0 = none, max 100). Use the nested /watched-users/ endpoint for paginated walks.

# paths./api/core/watched-groups/{id}/.get.parameters[].description
Inline up to N watchers in the response (0 = none, max 100). Use the nested /watchers/ endpoint for paginated walks.

# paths./api/core/watched-groups/{id}/.put.description
CRUD for WatchedGroup. Watcher mutations live on the nested /watchers/ endpoint;
POST here accepts an optional `watchers` array as a create-time convenience.

# paths./api/core/watched-groups/{id}/.put.parameters[].description
A unique integer value identifying this Watched Group.

# paths./api/core/watched-groups/{id}/.put.parameters[].description
Service-account only: target platform key. Non-SA callers' platform is sourced from the auth token and this is ignored.

# paths./api/core/watched-groups/{id}/.put.parameters[].description
Inline up to N watched users in the response (0 = none, max 100). Use the nested /watched-users/ endpoint for paginated walks.

# paths./api/core/watched-groups/{id}/.put.parameters[].description
Inline up to N watchers in the response (0 = none, max 100). Use the nested /watchers/ endpoint for paginated walks.

# paths./api/core/watched-groups/{id}/.patch.description
CRUD for WatchedGroup. Watcher mutations live on the nested /watchers/ endpoint;
POST here accepts an optional `watchers` array as a create-time convenience.

# paths./api/core/watched-groups/{id}/.patch.parameters[].description
A unique integer value identifying this Watched Group.

# paths./api/core/watched-groups/{id}/.patch.parameters[].description
Service-account only: target platform key. Non-SA callers' platform is sourced from the auth token and this is ignored.

# paths./api/core/watched-groups/{id}/.patch.parameters[].description
Inline up to N watched users in the response (0 = none, max 100). Use the nested /watched-users/ endpoint for paginated walks.

# paths./api/core/watched-groups/{id}/.patch.parameters[].description
Inline up to N watchers in the response (0 = none, max 100). Use the nested /watchers/ endpoint for paginated walks.

# paths./api/core/watched-groups/{id}/.delete.description
CRUD for WatchedGroup. Watcher mutations live on the nested /watchers/ endpoint;
POST here accepts an optional `watchers` array as a create-time convenience.

# paths./api/core/watched-groups/{id}/.delete.parameters[].description
A unique integer value identifying this Watched Group.

# paths./api/core/watched-groups/{id}/.delete.parameters[].description
Service-account only: target platform key. Non-SA callers' platform is sourced from the auth token and this is ignored.

# paths./api/core/watched-groups/{watched_group_pk}/watched-users/.get.description
CRUD-minus-update for watched users (UserGroupLink rows) under a WatchedGroup.

Resource path: /platforms/{pk}/watchedgroups/{wg_id}/watchedusers/{link_id}/
No PATCH/PUT — there's nothing meaningful to update on a UserGroupLink for
this feature. Add via POST, remove via DELETE.

# paths./api/core/watched-groups/{watched_group_pk}/watched-users/.get.summary
List watched users in a watched group (paginated)

# paths./api/core/watched-groups/{watched_group_pk}/watched-users/.get.parameters[].description
The initial index from which to return the results.

# paths./api/core/watched-groups/{watched_group_pk}/watched-users/.get.parameters[].description
Service-account only: target platform key. Non-SA callers' platform is sourced from the auth token and this is ignored.

# paths./api/core/watched-groups/{watched_group_pk}/watched-users/.post.description
CRUD-minus-update for watched users (UserGroupLink rows) under a WatchedGroup.

Resource path: /platforms/{pk}/watchedgroups/{wg_id}/watchedusers/{link_id}/
No PATCH/PUT — there's nothing meaningful to update on a UserGroupLink for
this feature. Add via POST, remove via DELETE.

# paths./api/core/watched-groups/{watched_group_pk}/watched-users/.post.parameters[].description
Service-account only: target platform key. Non-SA callers' platform is sourced from the auth token and this is ignored.

# paths./api/core/watched-groups/{watched_group_pk}/watched-users/{id}/.get.description
CRUD-minus-update for watched users (UserGroupLink rows) under a WatchedGroup.

Resource path: /platforms/{pk}/watchedgroups/{wg_id}/watchedusers/{link_id}/
No PATCH/PUT — there's nothing meaningful to update on a UserGroupLink for
this feature. Add via POST, remove via DELETE.

# paths./api/core/watched-groups/{watched_group_pk}/watched-users/{id}/.get.parameters[].description
Service-account only: target platform key. Non-SA callers' platform is sourced from the auth token and this is ignored.

# paths./api/core/watched-groups/{watched_group_pk}/watched-users/{id}/.delete.description
CRUD-minus-update for watched users (UserGroupLink rows) under a WatchedGroup.

Resource path: /platforms/{pk}/watchedgroups/{wg_id}/watchedusers/{link_id}/
No PATCH/PUT — there's nothing meaningful to update on a UserGroupLink for
this feature. Add via POST, remove via DELETE.

# paths./api/core/watched-groups/{watched_group_pk}/watched-users/{id}/.delete.parameters[].description
Service-account only: target platform key. Non-SA callers' platform is sourced from the auth token and this is ignored.

# paths./api/core/watched-groups/{watched_group_pk}/watchers/.get.description
CRUD for watchers nested under a WatchedGroup.

Resource path: /platforms/{pk}/watchedgroups/{wg_id}/watchers/{watcher_id}/
`is_owner` here covers two cases that both deserve owner-level perms on a
watcher row:
  - the watcher themselves (WATCHER_OWNER well-known role)
  - the parent WatchedGroup's owner (WATCHED_GROUP_OWNER role grants
    `Ibl.Core/Watchers/*`)

# paths./api/core/watched-groups/{watched_group_pk}/watchers/.get.summary
List watchers of a watched group (paginated)

# paths./api/core/watched-groups/{watched_group_pk}/watchers/.get.parameters[].description
The initial index from which to return the results.

# paths./api/core/watched-groups/{watched_group_pk}/watchers/.get.parameters[].description
Service-account only: target platform key. Non-SA callers' platform is sourced from the auth token and this is ignored.

# paths./api/core/watched-groups/{watched_group_pk}/watchers/.post.description
CRUD for watchers nested under a WatchedGroup.

Resource path: /platforms/{pk}/watchedgroups/{wg_id}/watchers/{watcher_id}/
`is_owner` here covers two cases that both deserve owner-level perms on a
watcher row:
  - the watcher themselves (WATCHER_OWNER well-known role)
  - the parent WatchedGroup's owner (WATCHED_GROUP_OWNER role grants
    `Ibl.Core/Watchers/*`)

# paths./api/core/watched-groups/{watched_group_pk}/watchers/.post.parameters[].description
Service-account only: target platform key. Non-SA callers' platform is sourced from the auth token and this is ignored.

# paths./api/core/watched-groups/{watched_group_pk}/watchers/{id}/.get.description
CRUD for watchers nested under a WatchedGroup.

Resource path: /platforms/{pk}/watchedgroups/{wg_id}/watchers/{watcher_id}/
`is_owner` here covers two cases that both deserve owner-level perms on a
watcher row:
  - the watcher themselves (WATCHER_OWNER well-known role)
  - the parent WatchedGroup's owner (WATCHED_GROUP_OWNER role grants
    `Ibl.Core/Watchers/*`)

# paths./api/core/watched-groups/{watched_group_pk}/watchers/{id}/.get.parameters[].description
Service-account only: target platform key. Non-SA callers' platform is sourced from the auth token and this is ignored.

# paths./api/core/watched-groups/{watched_group_pk}/watchers/{id}/.put.description
CRUD for watchers nested under a WatchedGroup.

Resource path: /platforms/{pk}/watchedgroups/{wg_id}/watchers/{watcher_id}/
`is_owner` here covers two cases that both deserve owner-level perms on a
watcher row:
  - the watcher themselves (WATCHER_OWNER well-known role)
  - the parent WatchedGroup's owner (WATCHED_GROUP_OWNER role grants
    `Ibl.Core/Watchers/*`)

# paths./api/core/watched-groups/{watched_group_pk}/watchers/{id}/.put.parameters[].description
Service-account only: target platform key. Non-SA callers' platform is sourced from the auth token and this is ignored.

# paths./api/core/watched-groups/{watched_group_pk}/watchers/{id}/.patch.description
CRUD for watchers nested under a WatchedGroup.

Resource path: /platforms/{pk}/watchedgroups/{wg_id}/watchers/{watcher_id}/
`is_owner` here covers two cases that both deserve owner-level perms on a
watcher row:
  - the watcher themselves (WATCHER_OWNER well-known role)
  - the parent WatchedGroup's owner (WATCHED_GROUP_OWNER role grants
    `Ibl.Core/Watchers/*`)

# paths./api/core/watched-groups/{watched_group_pk}/watchers/{id}/.patch.parameters[].description
Service-account only: target platform key. Non-SA callers' platform is sourced from the auth token and this is ignored.

# paths./api/core/watched-groups/{watched_group_pk}/watchers/{id}/.delete.description
CRUD for watchers nested under a WatchedGroup.

Resource path: /platforms/{pk}/watchedgroups/{wg_id}/watchers/{watcher_id}/
`is_owner` here covers two cases that both deserve owner-level perms on a
watcher row:
  - the watcher themselves (WATCHER_OWNER well-known role)
  - the parent WatchedGroup's owner (WATCHED_GROUP_OWNER role grants
    `Ibl.Core/Watchers/*`)

# paths./api/core/watched-groups/{watched_group_pk}/watchers/{id}/.delete.summary
Remove (or unsubscribe) a watcher from a watched group

# paths./api/core/watched-groups/{watched_group_pk}/watchers/{id}/.delete.parameters[].description
Service-account only: target platform key. Non-SA callers' platform is sourced from the auth token and this is ignored.

# paths./api/core/watched-groups/watcher-event-choices/.get.description
Return the WatcherEvent choices as `{value: human_readable_label}`.

Platform-scoped lookup with no per-watched-group context. Gated by
`Ibl.Core/WatchedGroups/list` on `/platforms/{pk}/watchedgroups/` — the
same per-platform grant `add_watcher` attaches to every watcher, so any
watcher (in addition to admins) can fetch the enum.

# paths./api/core/watched-groups/watcher-event-choices/.get.summary
List WatcherEvent choices as {value: label}

# paths./api/core/watched-groups/watcher-event-choices/.get.parameters[].description
Case-insensitive substring filter against the human-readable label. Omit to return all choices.

# paths./api/core/watched-groups/watcher-event-choices/.get.parameters[].description
Service-account only: target platform key. Non-SA callers' platform is sourced from the auth token and this is ignored.

# paths./api/core/watched-groups/watcher-event-choices/.get.responses.200.description
Mapping of event value to human-readable label

# paths./api/credentials/exim/credentials/course/{course_id}/export/.get.description
Export credential information for a specific course.

Args:
    request: The HTTP request object
    course_id: Course ID to export credentials for

Returns:
    Response: JSON response with credential data

# paths./api/credentials/exim/credentials/course/{course_id}/import/.post.description
Import credential information for a specific course.

Args:
    request: The HTTP request object
    course_id: Course ID to import credentials for

Returns:
    Response: JSON response with import results

# paths./api/credentials/orgs/{platform_key}/users/{user_id}/.get.description
Get all credentials for a platform with search and pagination support.

Query Parameters:
- platform_org: Platform org ID (takes precedence over URL org)
- page: Page number (default: 1)
- page_size: Items per page (default: 10, max: 100)
- search: Search term to filter credentials
- course: Course ID to filter credentials
- program: Program ID to filter credentials

# paths./api/credentials/orgs/{platform_key}/users/{user_id}/.post.description
API View for managing credentials across a platform.

This endpoint allows creating and retrieving credentials for a specific organization/tenant,
with support for filtering, searching, and pagination.

Path Parameters:
    org (str): The organization/tenant identifier
    user_id (str): The user ID making the request

Query Parameters:
    # Platform identification
    platform_org (str, optional): Alternative platform identifier (takes precedence over URL org)

    # Pagination
    page (int, optional): Page number (default: 1)
    page_size (int, optional): Items per page (default: 10, max: 100)

    # Filtering and search
    search (str, optional): Search term to filter credentials by name or description
    course (str, optional): Course ID to filter credentials associated with a specific course
    program (str, optional): Program ID to filter credentials associated with a specific program

Methods:
    GET: Retrieve credentials with filtering and pagination
    POST: Create a new credential

POST Request Body:
    A JSON object containing credential details:
    - name (str): Credential name
    - description (str, optional): Credential description
    - issuer (str): Issuer entity ID
    - credential_type (str, optional): Type of credential
    - html_template (str, optional): HTML template for credential rendering
    - css_template (str, optional): CSS template for credential styling
    - icon_image (str, optional): URL to credential icon
    - background_image (str, optional): URL to credential background
    - thumbnail_image (str, optional): URL to credential thumbnail
    - criteria_url (str, optional): URL to credential criteria
    - criteria_text (str, optional): Text description of credential criteria
    - issuing_signal (str, optional): Signal that triggers credential issuance

Returns:
    GET: A JSON response containing:
        {
            "status": {"success": true, "description": "Ok"},
            "result": {
                "next": "URL to next page",
                "previous": "URL to previous page",
                "count": 42,
                "data": [
                    {credential object},
                    {credential object},
                    ...
                ],
                "num_pages": 5,
                "page_number": 1,
                "max_page_size": 100
            }
        }

    POST: A JSON response containing:
        {
            "status": {"success": true, "description": "Created"},
            "result": {credential object}
        }

Error Responses:
    400 Bad Request: If the request data is invalid
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to access this resource
    404 Not Found: If the platform doesn't exist
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Requires CredentialAssignmentPermission
    - Only public credentials are returned by default

# paths./api/credentials/orgs/{platform_key}/users/{user_id}/{entity_id}.get.description
API View for managing individual credentials.

This endpoint allows retrieving, updating, and deleting specific credentials
identified by their entity_id.

Path Parameters:
    org (str): The organization/tenant identifier
    user_id (str): The user ID making the request
    entity_id (str): The credential entity ID

Methods:
    GET: Retrieve a specific credential
    PUT: Update a specific credential
    DELETE: Delete a specific credential

PUT Request Body:
    A JSON object containing credential details to update:
    - name (str, optional): Credential name
    - description (str, optional): Credential description
    - credential_type (str, optional): Type of credential
    - html_template (str, optional): HTML template for credential rendering
    - css_template (str, optional): CSS template for credential styling
    - icon_image (str, optional): URL to credential icon
    - background_image (str, optional): URL to credential background
    - thumbnail_image (str, optional): URL to credential thumbnail
    - criteria_url (str, optional): URL to credential criteria
    - criteria_text (str, optional): Text description of credential criteria
    - issuing_signal (str, optional): Signal that triggers credential issuance

Returns:
    GET: A JSON response containing:
        {
            "status": {"success": true, "description": "Ok"},
            "result": {credential object}
        }

    PUT: A JSON response containing:
        {
            "status": {"success": true, "description": "Updated"},
            "result": {credential object}
        }

    DELETE: A JSON response indicating success:
        {
            "status": {"success": true, "description": "Deleted"}
        }

Error Responses:
    400 Bad Request: If the request data is invalid
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to access this resource
    404 Not Found: If the credential doesn't exist
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Requires CredentialAssignmentPermission
    - Users can only manage credentials they have permission to access

# paths./api/credentials/orgs/{platform_key}/users/{user_id}/{entity_id}.put.description
API View for managing individual credentials.

This endpoint allows retrieving, updating, and deleting specific credentials
identified by their entity_id.

Path Parameters:
    org (str): The organization/tenant identifier
    user_id (str): The user ID making the request
    entity_id (str): The credential entity ID

Methods:
    GET: Retrieve a specific credential
    PUT: Update a specific credential
    DELETE: Delete a specific credential

PUT Request Body:
    A JSON object containing credential details to update:
    - name (str, optional): Credential name
    - description (str, optional): Credential description
    - credential_type (str, optional): Type of credential
    - html_template (str, optional): HTML template for credential rendering
    - css_template (str, optional): CSS template for credential styling
    - icon_image (str, optional): URL to credential icon
    - background_image (str, optional): URL to credential background
    - thumbnail_image (str, optional): URL to credential thumbnail
    - criteria_url (str, optional): URL to credential criteria
    - criteria_text (str, optional): Text description of credential criteria
    - issuing_signal (str, optional): Signal that triggers credential issuance

Returns:
    GET: A JSON response containing:
        {
            "status": {"success": true, "description": "Ok"},
            "result": {credential object}
        }

    PUT: A JSON response containing:
        {
            "status": {"success": true, "description": "Updated"},
            "result": {credential object}
        }

    DELETE: A JSON response indicating success:
        {
            "status": {"success": true, "description": "Deleted"}
        }

Error Responses:
    400 Bad Request: If the request data is invalid
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to access this resource
    404 Not Found: If the credential doesn't exist
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Requires CredentialAssignmentPermission
    - Users can only manage credentials they have permission to access

# paths./api/credentials/orgs/{platform_key}/users/{user_id}/{entity_id}.delete.description
API View for managing individual credentials.

This endpoint allows retrieving, updating, and deleting specific credentials
identified by their entity_id.

Path Parameters:
    org (str): The organization/tenant identifier
    user_id (str): The user ID making the request
    entity_id (str): The credential entity ID

Methods:
    GET: Retrieve a specific credential
    PUT: Update a specific credential
    DELETE: Delete a specific credential

PUT Request Body:
    A JSON object containing credential details to update:
    - name (str, optional): Credential name
    - description (str, optional): Credential description
    - credential_type (str, optional): Type of credential
    - html_template (str, optional): HTML template for credential rendering
    - css_template (str, optional): CSS template for credential styling
    - icon_image (str, optional): URL to credential icon
    - background_image (str, optional): URL to credential background
    - thumbnail_image (str, optional): URL to credential thumbnail
    - criteria_url (str, optional): URL to credential criteria
    - criteria_text (str, optional): Text description of credential criteria
    - issuing_signal (str, optional): Signal that triggers credential issuance

Returns:
    GET: A JSON response containing:
        {
            "status": {"success": true, "description": "Ok"},
            "result": {credential object}
        }

    PUT: A JSON response containing:
        {
            "status": {"success": true, "description": "Updated"},
            "result": {credential object}
        }

    DELETE: A JSON response indicating success:
        {
            "status": {"success": true, "description": "Deleted"}
        }

Error Responses:
    400 Bad Request: If the request data is invalid
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to access this resource
    404 Not Found: If the credential doesn't exist
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Requires CredentialAssignmentPermission
    - Users can only manage credentials they have permission to access

# paths./api/credentials/orgs/{platform_key}/users/{user_id}/assertions/.get.description
A GET View that validates QueryParams and returns results to a serializer

# paths./api/credentials/orgs/{platform_key}/users/{user_id}/assertions-.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/credentials/orgs/{platform_key}/users/{user_id}/assignments.delete.description
Delete a credential assignment using its entity_id.
Only platform admins and department admins can delete assignments.

# paths./api/credentials/orgs/{platform_key}/users/{user_id}/assignments.get.description
Get group assignments with department-aware filtering

# paths./api/credentials/orgs/{platform_key}/users/{user_id}/assignments.post.description
Create group assignment with department access validation

# paths./api/credentials/orgs/{platform_key}/users/{user_id}/assignments.get.description
Get assignments and their corresponding assertions based on user role:
- Regular users: get only their own assignments
- Platform admins: get assignments for all users in their platform
- Department admins: get assignments for users in their department groups

# paths./api/credentials/orgs/{platform_key}/users/{user_id}/assignments.post.description
Create assignments with department access validation

# paths./api/credentials/orgs/{platform_key}/users/{user_id}/course-asse.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/credentials/orgs/{platform_key}/users/{user_id}/course-cred.get.description
DRF view mixin that routes all ORM reads to the read replica.

Falls back to the primary database if the replica is unreachable.

Add as the **first** base class on read-only views/viewsets::

    class MyView(ReadReplicaViewMixin, IsPlatformAdminDRFMixin, APIView):
        ...

# paths./api/credentials/orgs/{platform_key}/users/{user_id}/course-cred.get.parameters[].description
A page number within the paginated result set.

# paths./api/credentials/orgs/{platform_key}/users/{user_id}/credentials.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/credentials/orgs/{platform_key}/users/{user_id}/external-ma.get.description
Retrieve external credential mappings for the platform.

Query Parameters:
    credential_id (str, optional): Filter by credential entity_id
    provider_name (str, optional): Filter by provider name
    page (int, optional): Page number
    page_size (int, optional): Items per page

Returns all mappings for the platform if the user is an admin.

# paths./api/credentials/orgs/{platform_key}/users/{user_id}/external-ma.post.description
Create or update an external credential mapping.

If a mapping doesn't exist for the credential + platform + provider combination,
it will be created. If it exists, it will be updated.

Request Body:
    {
        "credential_id": "credential-entity-id",  // Required
        "provider_name": "accredible",            // Required
        "external_template_id": "123456",         // Optional
        "metadata": {}                            // Optional
    }

Returns:
    - 201 Created: When creating a new mapping
    - 200 OK: When updating an existing mapping

# paths./api/credentials/orgs/{platform_key}/users/{user_id}/external-ma.delete.description
Delete an external credential mapping.

Request Body:
    {
        "credential_id": "credential-entity-id",  // Required
        "provider_name": "accredible"             // Required
    }

Returns:
    A JSON response confirming deletion

# paths./api/credentials/orgs/{platform_key}/users/{user_id}/issuers/.get.description
A GET View that validates QueryParams and returns results to a serializer

# paths./api/credentials/orgs/{platform_key}/users/{user_id}/issuers/.post.description
A GET View that validates QueryParams and returns results to a serializer

# paths./api/credentials/orgs/{platform_key}/users/{user_id}/provider-co.get.description
Retrieve provider configurations for the platform.

Query Parameters:
    provider_name (str, optional): Filter to a specific provider
    page (int, optional): Page number
    page_size (int, optional): Items per page

Returns all configurations for the platform if the user is an admin.

# paths./api/credentials/orgs/{platform_key}/users/{user_id}/provider-co.post.description
Create or update a provider configuration.

If a configuration doesn't exist for the platform and provider, it will be created.
If it exists, it will be updated.

Request Body:
    {
        "provider_name": "accredible",  // Required
        "config": {...},                 // Optional
        "enabled": true                  // Optional
    }

Returns:
    - 201 Created: When creating a new configuration
    - 200 OK: When updating an existing configuration

# paths./api/credentials/orgs/{platform_key}/users/{user_id}/provider-co.delete.description
Deactivate a provider configuration (sets enabled=False).

Request Body:
    {
        "provider_name": "accredible"  // Required
    }

# paths./api/credentials/orgs/{platform_key}/users/{username}/.get.description
Get all credentials for a platform with search and pagination support.

Query Parameters:
- platform_org: Platform org ID (takes precedence over URL org)
- page: Page number (default: 1)
- page_size: Items per page (default: 10, max: 100)
- search: Search term to filter credentials
- course: Course ID to filter credentials
- program: Program ID to filter credentials

# paths./api/credentials/orgs/{platform_key}/users/{username}/.post.description
API View for managing credentials across a platform.

This endpoint allows creating and retrieving credentials for a specific organization/tenant,
with support for filtering, searching, and pagination.

Path Parameters:
    org (str): The organization/tenant identifier
    user_id (str): The user ID making the request

Query Parameters:
    # Platform identification
    platform_org (str, optional): Alternative platform identifier (takes precedence over URL org)

    # Pagination
    page (int, optional): Page number (default: 1)
    page_size (int, optional): Items per page (default: 10, max: 100)

    # Filtering and search
    search (str, optional): Search term to filter credentials by name or description
    course (str, optional): Course ID to filter credentials associated with a specific course
    program (str, optional): Program ID to filter credentials associated with a specific program

Methods:
    GET: Retrieve credentials with filtering and pagination
    POST: Create a new credential

POST Request Body:
    A JSON object containing credential details:
    - name (str): Credential name
    - description (str, optional): Credential description
    - issuer (str): Issuer entity ID
    - credential_type (str, optional): Type of credential
    - html_template (str, optional): HTML template for credential rendering
    - css_template (str, optional): CSS template for credential styling
    - icon_image (str, optional): URL to credential icon
    - background_image (str, optional): URL to credential background
    - thumbnail_image (str, optional): URL to credential thumbnail
    - criteria_url (str, optional): URL to credential criteria
    - criteria_text (str, optional): Text description of credential criteria
    - issuing_signal (str, optional): Signal that triggers credential issuance

Returns:
    GET: A JSON response containing:
        {
            "status": {"success": true, "description": "Ok"},
            "result": {
                "next": "URL to next page",
                "previous": "URL to previous page",
                "count": 42,
                "data": [
                    {credential object},
                    {credential object},
                    ...
                ],
                "num_pages": 5,
                "page_number": 1,
                "max_page_size": 100
            }
        }

    POST: A JSON response containing:
        {
            "status": {"success": true, "description": "Created"},
            "result": {credential object}
        }

Error Responses:
    400 Bad Request: If the request data is invalid
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to access this resource
    404 Not Found: If the platform doesn't exist
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Requires CredentialAssignmentPermission
    - Only public credentials are returned by default

# paths./api/credentials/orgs/{platform_key}/users/{username}/{entity_id.get.description
API View for managing individual credentials.

This endpoint allows retrieving, updating, and deleting specific credentials
identified by their entity_id.

Path Parameters:
    org (str): The organization/tenant identifier
    user_id (str): The user ID making the request
    entity_id (str): The credential entity ID

Methods:
    GET: Retrieve a specific credential
    PUT: Update a specific credential
    DELETE: Delete a specific credential

PUT Request Body:
    A JSON object containing credential details to update:
    - name (str, optional): Credential name
    - description (str, optional): Credential description
    - credential_type (str, optional): Type of credential
    - html_template (str, optional): HTML template for credential rendering
    - css_template (str, optional): CSS template for credential styling
    - icon_image (str, optional): URL to credential icon
    - background_image (str, optional): URL to credential background
    - thumbnail_image (str, optional): URL to credential thumbnail
    - criteria_url (str, optional): URL to credential criteria
    - criteria_text (str, optional): Text description of credential criteria
    - issuing_signal (str, optional): Signal that triggers credential issuance

Returns:
    GET: A JSON response containing:
        {
            "status": {"success": true, "description": "Ok"},
            "result": {credential object}
        }

    PUT: A JSON response containing:
        {
            "status": {"success": true, "description": "Updated"},
            "result": {credential object}
        }

    DELETE: A JSON response indicating success:
        {
            "status": {"success": true, "description": "Deleted"}
        }

Error Responses:
    400 Bad Request: If the request data is invalid
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to access this resource
    404 Not Found: If the credential doesn't exist
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Requires CredentialAssignmentPermission
    - Users can only manage credentials they have permission to access

# paths./api/credentials/orgs/{platform_key}/users/{username}/{entity_id.put.description
API View for managing individual credentials.

This endpoint allows retrieving, updating, and deleting specific credentials
identified by their entity_id.

Path Parameters:
    org (str): The organization/tenant identifier
    user_id (str): The user ID making the request
    entity_id (str): The credential entity ID

Methods:
    GET: Retrieve a specific credential
    PUT: Update a specific credential
    DELETE: Delete a specific credential

PUT Request Body:
    A JSON object containing credential details to update:
    - name (str, optional): Credential name
    - description (str, optional): Credential description
    - credential_type (str, optional): Type of credential
    - html_template (str, optional): HTML template for credential rendering
    - css_template (str, optional): CSS template for credential styling
    - icon_image (str, optional): URL to credential icon
    - background_image (str, optional): URL to credential background
    - thumbnail_image (str, optional): URL to credential thumbnail
    - criteria_url (str, optional): URL to credential criteria
    - criteria_text (str, optional): Text description of credential criteria
    - issuing_signal (str, optional): Signal that triggers credential issuance

Returns:
    GET: A JSON response containing:
        {
            "status": {"success": true, "description": "Ok"},
            "result": {credential object}
        }

    PUT: A JSON response containing:
        {
            "status": {"success": true, "description": "Updated"},
            "result": {credential object}
        }

    DELETE: A JSON response indicating success:
        {
            "status": {"success": true, "description": "Deleted"}
        }

Error Responses:
    400 Bad Request: If the request data is invalid
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to access this resource
    404 Not Found: If the credential doesn't exist
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Requires CredentialAssignmentPermission
    - Users can only manage credentials they have permission to access

# paths./api/credentials/orgs/{platform_key}/users/{username}/{entity_id.delete.description
API View for managing individual credentials.

This endpoint allows retrieving, updating, and deleting specific credentials
identified by their entity_id.

Path Parameters:
    org (str): The organization/tenant identifier
    user_id (str): The user ID making the request
    entity_id (str): The credential entity ID

Methods:
    GET: Retrieve a specific credential
    PUT: Update a specific credential
    DELETE: Delete a specific credential

PUT Request Body:
    A JSON object containing credential details to update:
    - name (str, optional): Credential name
    - description (str, optional): Credential description
    - credential_type (str, optional): Type of credential
    - html_template (str, optional): HTML template for credential rendering
    - css_template (str, optional): CSS template for credential styling
    - icon_image (str, optional): URL to credential icon
    - background_image (str, optional): URL to credential background
    - thumbnail_image (str, optional): URL to credential thumbnail
    - criteria_url (str, optional): URL to credential criteria
    - criteria_text (str, optional): Text description of credential criteria
    - issuing_signal (str, optional): Signal that triggers credential issuance

Returns:
    GET: A JSON response containing:
        {
            "status": {"success": true, "description": "Ok"},
            "result": {credential object}
        }

    PUT: A JSON response containing:
        {
            "status": {"success": true, "description": "Updated"},
            "result": {credential object}
        }

    DELETE: A JSON response indicating success:
        {
            "status": {"success": true, "description": "Deleted"}
        }

Error Responses:
    400 Bad Request: If the request data is invalid
    401 Unauthorized: If the user is not authenticated
    403 Forbidden: If the user does not have permission to access this resource
    404 Not Found: If the credential doesn't exist
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Requires CredentialAssignmentPermission
    - Users can only manage credentials they have permission to access

# paths./api/credentials/orgs/{platform_key}/users/{username}/assertions.get.description
A GET View that validates QueryParams and returns results to a serializer

# paths./api/credentials/orgs/{platform_key}/users/{username}/assertions.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/credentials/orgs/{platform_key}/users/{username}/assignment.delete.description
Delete a credential assignment using its entity_id.
Only platform admins and department admins can delete assignments.

# paths./api/credentials/orgs/{platform_key}/users/{username}/assignment.get.description
Get group assignments with department-aware filtering

# paths./api/credentials/orgs/{platform_key}/users/{username}/assignment.post.description
Create group assignment with department access validation

# paths./api/credentials/orgs/{platform_key}/users/{username}/assignment.get.description
Get assignments and their corresponding assertions based on user role:
- Regular users: get only their own assignments
- Platform admins: get assignments for all users in their platform
- Department admins: get assignments for users in their department groups

# paths./api/credentials/orgs/{platform_key}/users/{username}/assignment.post.description
Create assignments with department access validation

# paths./api/credentials/orgs/{platform_key}/users/{username}/course-ass.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/credentials/orgs/{platform_key}/users/{username}/course-cre.get.description
DRF view mixin that routes all ORM reads to the read replica.

Falls back to the primary database if the replica is unreachable.

Add as the **first** base class on read-only views/viewsets::

    class MyView(ReadReplicaViewMixin, IsPlatformAdminDRFMixin, APIView):
        ...

# paths./api/credentials/orgs/{platform_key}/users/{username}/course-cre.get.parameters[].description
A page number within the paginated result set.

# paths./api/credentials/orgs/{platform_key}/users/{username}/credential.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/credentials/orgs/{platform_key}/users/{username}/external-m.get.description
Retrieve external credential mappings for the platform.

Query Parameters:
    credential_id (str, optional): Filter by credential entity_id
    provider_name (str, optional): Filter by provider name
    page (int, optional): Page number
    page_size (int, optional): Items per page

Returns all mappings for the platform if the user is an admin.

# paths./api/credentials/orgs/{platform_key}/users/{username}/external-m.post.description
Create or update an external credential mapping.

If a mapping doesn't exist for the credential + platform + provider combination,
it will be created. If it exists, it will be updated.

Request Body:
    {
        "credential_id": "credential-entity-id",  // Required
        "provider_name": "accredible",            // Required
        "external_template_id": "123456",         // Optional
        "metadata": {}                            // Optional
    }

Returns:
    - 201 Created: When creating a new mapping
    - 200 OK: When updating an existing mapping

# paths./api/credentials/orgs/{platform_key}/users/{username}/external-m.delete.description
Delete an external credential mapping.

Request Body:
    {
        "credential_id": "credential-entity-id",  // Required
        "provider_name": "accredible"             // Required
    }

Returns:
    A JSON response confirming deletion

# paths./api/credentials/orgs/{platform_key}/users/{username}/issuers/.get.description
A GET View that validates QueryParams and returns results to a serializer

# paths./api/credentials/orgs/{platform_key}/users/{username}/issuers/.post.description
A GET View that validates QueryParams and returns results to a serializer

# paths./api/credentials/orgs/{platform_key}/users/{username}/provider-c.get.description
Retrieve provider configurations for the platform.

Query Parameters:
    provider_name (str, optional): Filter to a specific provider
    page (int, optional): Page number
    page_size (int, optional): Items per page

Returns all configurations for the platform if the user is an admin.

# paths./api/credentials/orgs/{platform_key}/users/{username}/provider-c.post.description
Create or update a provider configuration.

If a configuration doesn't exist for the platform and provider, it will be created.
If it exists, it will be updated.

Request Body:
    {
        "provider_name": "accredible",  // Required
        "config": {...},                 // Optional
        "enabled": true                  // Optional
    }

Returns:
    - 201 Created: When creating a new configuration
    - 200 OK: When updating an existing configuration

# paths./api/credentials/orgs/{platform_key}/users/{username}/provider-c.delete.description
Deactivate a provider configuration (sets enabled=False).

Request Body:
    {
        "provider_name": "accredible"  // Required
    }

# paths./api/credentials/providers/.get.description
Get list of enabled credential providers with pagination.

# paths./api/credentials/public/assertions/{entity_id}/.get.description
Public endpoint to retrieve a specific credential assertion by its entity ID.

This endpoint allows public access to view a specific credential assertion
without authentication.

Path Parameters:
    entity_id (str): The assertion entity ID

Returns:
    A JSON response containing the assertion details using the AssertionSerializer format

Error Responses:
    404 Not Found:
        - If the assertion doesn't exist: Empty response with 404 status
        - If the assertion has been revoked: JSON with error detail and revocation reason
    500 Internal Server Error: If an unexpected error occurs

# paths./api/crm/activities/.get.description
Returns a paginated list of Activities in your Platform. Supports filtering by `type`, `is_done`, `owner`, `deal`, `person`, schedule-from ranges, and `metadata__has_key`.

**Required permission:** `Ibl.CRM/Activities/list`.

# paths./api/crm/activities/.get.parameters[].description
A page number within the paginated result set.

# paths./api/crm/activities/.get.parameters[].description
Interaction kind.

* `call` - Call
* `meeting` - Meeting
* `email` - Email
* `note` - Note
* `task` - Task
* `lunch` - Lunch
* `deadline` - Deadline

# paths./api/crm/activities/.post.description
Creates an Activity. Either `deal` or `person` must be supplied; both must belong to your Platform.

**Required permission:** `Ibl.CRM/Activities/action`.

# paths./api/crm/activities/{id}/.get.description
Returns a single Activity by id.

**Required permission:** `Ibl.CRM/Activities/read`.

# paths./api/crm/activities/{id}/.get.parameters[].description
A unique integer value identifying this activity.

# paths./api/crm/activities/{id}/.put.description
Replaces all editable fields on the Activity.

**Required permission:** `Ibl.CRM/Activities/write`.

# paths./api/crm/activities/{id}/.put.parameters[].description
A unique integer value identifying this activity.

# paths./api/crm/activities/{id}/.patch.description
Updates only the supplied fields on the Activity.

**Required permission:** `Ibl.CRM/Activities/write`.

# paths./api/crm/activities/{id}/.patch.parameters[].description
A unique integer value identifying this activity.

# paths./api/crm/activities/{id}/.delete.parameters[].description
A unique integer value identifying this activity.

# paths./api/crm/activities/{id}/done/.post.description
Flips `is_done=True` and stamps `done_at` if it isn't already set. Idempotent — calling on an already-done Activity preserves the original `done_at`.

**Required permission:** `Ibl.CRM/Activities/write`.

# paths./api/crm/activities/{id}/done/.post.parameters[].description
A unique integer value identifying this activity.

# paths./api/crm/deals/.get.description
Returns a paginated list of Deals in your Platform. Supports filtering by `status`, `pipeline`, `stage`, `owner`, `source`, `person`, `organization`, expected-close-date and created-at ranges, and `metadata__has_key`.

**Required permission:** `Ibl.CRM/Deals/list`.

# paths./api/crm/deals/.get.parameters[].description
A page number within the paginated result set.

# paths./api/crm/deals/.get.parameters[].description
Service-managed (read-only in serializer). Derived from the destination stage's is_won/is_lost.

* `open` - Open
* `won` - Won
* `lost` - Lost

# paths./api/crm/deals/.post.description
Creates a new Deal. All FK targets (`person`, `organization`, `pipeline`, `stage`, `source`) must belong to your Platform; `stage` must belong to `pipeline`. `status` and `closed_at` are service-managed — passing them returns `400`.

**Required permission:** `Ibl.CRM/Deals/action`.

# paths./api/crm/deals/{id}/.get.description
Returns a single Deal by id.

**Required permission:** `Ibl.CRM/Deals/read`.

# paths./api/crm/deals/{id}/.get.parameters[].description
A unique integer value identifying this deal.

# paths./api/crm/deals/{id}/.put.description
Replaces all editable fields on the Deal.

**Required permission:** `Ibl.CRM/Deals/write`.

# paths./api/crm/deals/{id}/.put.parameters[].description
A unique integer value identifying this deal.

# paths./api/crm/deals/{id}/.patch.description
Updates only the supplied fields on the Deal. Direct writes to `status` or `closed_at` are rejected with `400` — use `POST /deals/{id}/move-stage/`, `won/`, or `lost/`.

**Required permission:** `Ibl.CRM/Deals/write`.

# paths./api/crm/deals/{id}/.patch.parameters[].description
A unique integer value identifying this deal.

# paths./api/crm/deals/{id}/.delete.description
Deletes the Deal.

**Required permission:** `Ibl.CRM/Deals/delete`.

# paths./api/crm/deals/{id}/.delete.parameters[].description
A unique integer value identifying this deal.

# paths./api/crm/deals/{id}/lost/.post.description
Moves the Deal into a closed-lost stage and persists `lost_reason`. If `stage_code` is omitted, the first `is_lost=True` stage in the Deal's pipeline (by sort order) is used.

**Required permission:** `Ibl.CRM/Deals/write`.

# paths./api/crm/deals/{id}/lost/.post.parameters[].description
A unique integer value identifying this deal.

# paths./api/crm/deals/{id}/lost/.post.responses.400.description
Missing `lost_reason`, no `is_lost` stage configured, or the supplied stage_code is not flagged is_lost=True.

# paths./api/crm/deals/{id}/move-stage/.post.description
Moves the Deal to the stage identified by `stage_id` or `stage_code`. The target stage must belong to this Deal's pipeline. Records an audit Activity and emits `deal_stage_changed`. `Deal.status` is recomputed from the new stage's `is_won` / `is_lost` flags.

**Required permission:** `Ibl.CRM/Deals/write`.

# paths./api/crm/deals/{id}/move-stage/.post.parameters[].description
A unique integer value identifying this deal.

# paths./api/crm/deals/{id}/move-stage/.post.responses.400.description
Validation error (e.g. stage not in pipeline).

# paths./api/crm/deals/{id}/tags/.post.description
Attaches an existing Tag to this record. Both the Tag and the record must belong to your Platform. Returns `409 Conflict` with the existing `assignment_id` if the tag is already attached.

**Required permission:** `Ibl.CRM/Tags/write`.

# paths./api/crm/deals/{id}/tags/.post.parameters[].description
A unique integer value identifying this deal.

# paths./api/crm/deals/{id}/tags/{tag_id}/.delete.description
Removes the Tag with id `tag_id` from this record. Returns `404` if the tag was not attached.

**Required permission:** `Ibl.CRM/Tags/write`.

# paths./api/crm/deals/{id}/tags/{tag_id}/.delete.parameters[].description
A unique integer value identifying this deal.

# paths./api/crm/deals/{id}/won/.post.description
Moves the Deal into a closed-won stage and sets `status='won'`. If `stage_code` is omitted, the first `is_won=True` stage in the Deal's pipeline (by sort order) is used.

**Required permission:** `Ibl.CRM/Deals/write`.

# paths./api/crm/deals/{id}/won/.post.parameters[].description
A unique integer value identifying this deal.

# paths./api/crm/deals/{id}/won/.post.responses.400.description
No `is_won` stage configured, or the supplied stage_code is not flagged is_won=True.

# paths./api/crm/lead-sources/.get.description
Returns a paginated list of LeadSources in your Platform.

**Required permission:** `Ibl.CRM/Pipelines/list`.

# paths./api/crm/lead-sources/.get.parameters[].description
A page number within the paginated result set.

# paths./api/crm/lead-sources/.post.description
Creates a new LeadSource in your Platform. `code` must be unique.

**Required permission:** `Ibl.CRM/Pipelines/action`.

# paths./api/crm/lead-sources/{id}/.get.description
Returns a single LeadSource by id.

**Required permission:** `Ibl.CRM/Pipelines/read`.

# paths./api/crm/lead-sources/{id}/.get.parameters[].description
A unique integer value identifying this lead source.

# paths./api/crm/lead-sources/{id}/.put.description
Replaces all editable fields on the LeadSource.

**Required permission:** `Ibl.CRM/Pipelines/write`.

# paths./api/crm/lead-sources/{id}/.put.parameters[].description
A unique integer value identifying this lead source.

# paths./api/crm/lead-sources/{id}/.patch.description
Updates only the supplied fields on the LeadSource.

**Required permission:** `Ibl.CRM/Pipelines/write`.

# paths./api/crm/lead-sources/{id}/.patch.parameters[].description
A unique integer value identifying this lead source.

# paths./api/crm/lead-sources/{id}/.delete.description
Deletes the LeadSource. Any Deals referencing it have their `source` cleared.

**Required permission:** `Ibl.CRM/Pipelines/delete`.

# paths./api/crm/lead-sources/{id}/.delete.parameters[].description
A unique integer value identifying this lead source.

# paths./api/crm/organizations/.get.description
Returns a paginated list of organizations in your Platform. Supports filtering by `owner` and by `name` (case-insensitive substring match).

**Required permission:** `Ibl.CRM/Organizations/list`.

# paths./api/crm/organizations/.get.parameters[].description
A page number within the paginated result set.

# paths./api/crm/organizations/.post.description
Creates a new organization in your Platform. The Platform is inferred from your credentials. `name` must be unique within your Platform.

**Required permission:** `Ibl.CRM/Organizations/action`.

# paths./api/crm/organizations/.post.responses.400.description
Validation error (for example, duplicate name).

# paths./api/crm/organizations/{id}/.get.description
Returns a single organization by id.

**Required permission:** `Ibl.CRM/Organizations/read`.

# paths./api/crm/organizations/{id}/.get.parameters[].schema.description
Opaque UUID — used in API URLs and external references.

# paths./api/crm/organizations/{id}/.put.description
Replaces all editable fields on the organization.

**Required permission:** `Ibl.CRM/Organizations/write`.

# paths./api/crm/organizations/{id}/.put.parameters[].schema.description
Opaque UUID — used in API URLs and external references.

# paths./api/crm/organizations/{id}/.patch.description
Updates only the supplied fields on the organization.

**Required permission:** `Ibl.CRM/Organizations/write`.

# paths./api/crm/organizations/{id}/.patch.parameters[].schema.description
Opaque UUID — used in API URLs and external references.

# paths./api/crm/organizations/{id}/.delete.description
Deletes the organization. Any persons linked to it are kept; their organization reference is cleared.

**Required permission:** `Ibl.CRM/Organizations/delete`.

# paths./api/crm/organizations/{id}/.delete.parameters[].schema.description
Opaque UUID — used in API URLs and external references.

# paths./api/crm/organizations/{id}/tags/.post.description
Attaches an existing Tag to this record. Both the Tag and the record must belong to your Platform. Returns `409 Conflict` with the existing `assignment_id` if the tag is already attached.

**Required permission:** `Ibl.CRM/Tags/write`.

# paths./api/crm/organizations/{id}/tags/.post.parameters[].schema.description
Opaque UUID — used in API URLs and external references.

# paths./api/crm/organizations/{id}/tags/{tag_id}/.delete.description
Removes the Tag with id `tag_id` from this record. Returns `404` if the tag was not attached.

**Required permission:** `Ibl.CRM/Tags/write`.

# paths./api/crm/organizations/{id}/tags/{tag_id}/.delete.parameters[].schema.description
Opaque UUID — used in API URLs and external references.

# paths./api/crm/persons/.get.description
Returns a paginated list of persons in your Platform. Supports filtering by `lifecycle_stage`, `owner`, `organization`, `created_at__gte`/`created_at__lte`, and `metadata__has_key`.

**Required permission:** `Ibl.CRM/Persons/list`.

# paths./api/crm/persons/.get.parameters[].description
Funnel position. Transitions are unrestricted — any stage may move to any other.

* `lead` - Lead
* `qualified` - Qualified
* `opportunity` - Opportunity
* `customer` - Customer
* `churned` - Churned

# paths./api/crm/persons/.get.parameters[].description
A page number within the paginated result set.

# paths./api/crm/persons/.post.description
Creates a new person in your Platform. The Platform is inferred from your credentials. If `organization` is supplied, it must reference an organization in your Platform.

**Required permission:** `Ibl.CRM/Persons/action`.

# paths./api/crm/persons/{id}/.get.description
Returns a single person by id.

**Required permission:** `Ibl.CRM/Persons/read`.

# paths./api/crm/persons/{id}/.get.parameters[].schema.description
Opaque UUID — used in API URLs and external references.

# paths./api/crm/persons/{id}/.put.description
Replaces all editable fields on the person.

**Required permission:** `Ibl.CRM/Persons/write`.

# paths./api/crm/persons/{id}/.put.parameters[].schema.description
Opaque UUID — used in API URLs and external references.

# paths./api/crm/persons/{id}/.patch.description
Updates only the supplied fields on the person.

**Required permission:** `Ibl.CRM/Persons/write`.

# paths./api/crm/persons/{id}/.patch.parameters[].schema.description
Opaque UUID — used in API URLs and external references.

# paths./api/crm/persons/{id}/.delete.description
Deletes the person.

**Required permission:** `Ibl.CRM/Persons/delete`.

# paths./api/crm/persons/{id}/.delete.parameters[].schema.description
Opaque UUID — used in API URLs and external references.

# paths./api/crm/persons/{id}/invite/.post.description
Sends a platform invitation to the person's `primary_email`. On acceptance, the invitee joins your Platform with the privileges configured in the request body.

Returns `409 Conflict` if an active invitation already exists for this email in your Platform, and `422 Unprocessable Entity` if the person is already linked to a platform user.

**Required permission:** `Ibl.CRM/Invite/action`.

# paths./api/crm/persons/{id}/invite/.post.parameters[].schema.description
Opaque UUID — used in API URLs and external references.

# paths./api/crm/persons/{id}/invite/.post.responses.400.description
Person has no `primary_email`; cannot invite.

# paths./api/crm/persons/{id}/invite/.post.responses.422.description
Person is already linked to a platform user.

# paths./api/crm/persons/{id}/link-user/.post.description
Links this person to an existing platform user. The target user must already be a member of your Platform — if they are not, send them an invitation via `POST /persons/{id}/invite/` instead.

This call is idempotent: linking a person that is already bound to the same user is a no-op. Re-linking a person that is already bound to a *different* user is refused; the existing binding is preserved and the unchanged person is returned.

**Required permission:** `Ibl.CRM/Persons/write`.

# paths./api/crm/persons/{id}/link-user/.post.summary
Bind a person to an existing platform user

# paths./api/crm/persons/{id}/link-user/.post.parameters[].schema.description
Opaque UUID — used in API URLs and external references.

# paths./api/crm/persons/{id}/link-user/.post.responses.403.description
Missing required permission `Ibl.CRM/Persons/write`, or the target user is not a member of your Platform.

# paths./api/crm/persons/{id}/tags/.post.description
Attaches an existing Tag to this record. Both the Tag and the record must belong to your Platform. Returns `409 Conflict` with the existing `assignment_id` if the tag is already attached.

**Required permission:** `Ibl.CRM/Tags/write`.

# paths./api/crm/persons/{id}/tags/.post.parameters[].schema.description
Opaque UUID — used in API URLs and external references.

# paths./api/crm/persons/{id}/tags/{tag_id}/.delete.description
Removes the Tag with id `tag_id` from this record. Returns `404` if the tag was not attached.

**Required permission:** `Ibl.CRM/Tags/write`.

# paths./api/crm/persons/{id}/tags/{tag_id}/.delete.parameters[].schema.description
Opaque UUID — used in API URLs and external references.

# paths./api/crm/persons/merge/.post.description
Marks each person in `duplicate_ids` as inactive and reports how many related records (deals, activities, tags) were re-parented onto `primary_id`.

All ids — both the primary and every duplicate — must belong to your Platform. `primary_id` may not appear in `duplicate_ids`.

**Required permission:** `Ibl.CRM/Persons/write`.

# paths./api/crm/persons/merge/.post.responses.400.description
Validation error: the primary appears in duplicates, or one or more ids belong to another Platform.

# paths./api/crm/pipelines/.get.description
Returns a paginated list of Pipelines in your Platform. Each Pipeline includes its ordered `stages` inline.

**Required permission:** `Ibl.CRM/Pipelines/list`.

# paths./api/crm/pipelines/.get.parameters[].description
A page number within the paginated result set.

# paths./api/crm/pipelines/.post.description
Creates a new Pipeline. `code` must be unique within your Platform. Promoting another Pipeline to `is_default=true` while one already exists will fail — unset the existing default first.

**Required permission:** `Ibl.CRM/Pipelines/action`.

# paths./api/crm/pipelines/{pipeline_pk}/stages/.get.description
Returns the ordered list of PipelineStages for the given Pipeline.

**Required permission:** `Ibl.CRM/Pipelines/list`.

# paths./api/crm/pipelines/{pipeline_pk}/stages/.get.parameters[].description
A page number within the paginated result set.

# paths./api/crm/pipelines/{pipeline_pk}/stages/.post.description
Creates a new PipelineStage in the URL Pipeline. `code` must be unique within that Pipeline. At most one of `is_won` / `is_lost` may be true.

**Required permission:** `Ibl.CRM/Pipelines/action`.

# paths./api/crm/pipelines/{pipeline_pk}/stages/{id}/.get.description
Returns a single PipelineStage by id (must belong to the URL Pipeline).

**Required permission:** `Ibl.CRM/Pipelines/read`.

# paths./api/crm/pipelines/{pipeline_pk}/stages/{id}/.put.description
Replaces all editable fields on the PipelineStage.

**Required permission:** `Ibl.CRM/Pipelines/write`.

# paths./api/crm/pipelines/{pipeline_pk}/stages/{id}/.patch.description
Updates only the supplied fields on the PipelineStage.

**Required permission:** `Ibl.CRM/Pipelines/write`.

# paths./api/crm/pipelines/{pipeline_pk}/stages/{id}/.delete.description
Deletes the PipelineStage. Fails with `409 Conflict` if any Deal still references it (FK is PROTECTed).

**Required permission:** `Ibl.CRM/Pipelines/delete`.

# paths./api/crm/pipelines/{id}/.get.description
Returns a single Pipeline by id, including its ordered `stages`.

**Required permission:** `Ibl.CRM/Pipelines/read`.

# paths./api/crm/pipelines/{id}/.get.parameters[].description
A unique integer value identifying this pipeline.

# paths./api/crm/pipelines/{id}/.put.description
Replaces all editable fields on the Pipeline.

**Required permission:** `Ibl.CRM/Pipelines/write`.

# paths./api/crm/pipelines/{id}/.put.parameters[].description
A unique integer value identifying this pipeline.

# paths./api/crm/pipelines/{id}/.patch.description
Updates only the supplied fields on the Pipeline.

**Required permission:** `Ibl.CRM/Pipelines/write`.

# paths./api/crm/pipelines/{id}/.patch.parameters[].description
A unique integer value identifying this pipeline.

# paths./api/crm/pipelines/{id}/.delete.description
Deletes the Pipeline. Fails with `409 Conflict` if any Deal still references it (FK is PROTECTed).

**Required permission:** `Ibl.CRM/Pipelines/delete`.

# paths./api/crm/pipelines/{id}/.delete.parameters[].description
A unique integer value identifying this pipeline.

# paths./api/crm/tags/.get.description
Returns a paginated list of Tags in your Platform. Supports filtering by `name` (case-insensitive substring) and `created_at__gte`/`created_at__lte` ISO timestamp ranges.

**Required permission:** `Ibl.CRM/Tags/list`.

# paths./api/crm/tags/.get.parameters[].description
A page number within the paginated result set.

# paths./api/crm/tags/.post.description
Creates a new Tag in your Platform. `name` must be unique within your Platform; supply `color` as a `#RRGGBB` hex string (defaults to `#888888`).

**Required permission:** `Ibl.CRM/Tags/action`.

# paths./api/crm/tags/.post.responses.400.description
Validation error (duplicate name, bad color, etc.).

# paths./api/crm/tags/{id}/.get.description
Returns a single Tag by id.

**Required permission:** `Ibl.CRM/Tags/read`.

# paths./api/crm/tags/{id}/.get.parameters[].description
A unique integer value identifying this tag.

# paths./api/crm/tags/{id}/.put.description
Replaces all editable fields on the Tag.

**Required permission:** `Ibl.CRM/Tags/write`.

# paths./api/crm/tags/{id}/.put.parameters[].description
A unique integer value identifying this tag.

# paths./api/crm/tags/{id}/.patch.description
Updates only the supplied fields on the Tag (typically `name` or `color`).

**Required permission:** `Ibl.CRM/Tags/write`.

# paths./api/crm/tags/{id}/.patch.parameters[].description
A unique integer value identifying this tag.

# paths./api/crm/tags/{id}/.delete.description
Deletes the Tag. All attachments to Persons, Organizations, and Deals are removed atomically via cascade.

**Required permission:** `Ibl.CRM/Tags/delete`.

# paths./api/crm/tags/{id}/.delete.parameters[].description
A unique integer value identifying this tag.

# paths./api/custom-domains/.get.description
API endpoint to get custom domains (public, no authentication or permission checks)

# paths./api/custom-domains/{domain_id}/delete/.delete.description
API endpoint to hard delete a custom domain

# paths./api/custom-domains/{domain_id}/deleted-status/.post.description
API endpoint to update the is_deleted status of a custom domain

# paths./api/custom-domains/{domain_id}/status/.put.description
API endpoint to update custom domain SPA type

# paths./api/custom-domains/by-name/{domain_name}/status/.put.description
API endpoint to update custom domain SPA type by domain name

# paths./api/departments/orgs/{org}/.get.description
Get a list of departments with metrics and filtering options.

This endpoint provides a paginated list of departments with aggregated metrics
about learner performance, course completions, and skill acquisition.

Query Parameters:
    page (int, optional): Page number for pagination
    length (int, optional): Number of items per page
    program (str, optional): Filter by program
    pathway (str, optional): Filter by pathway
    departments (list, optional): Filter by department ids
    department_id (str, optional): Filter by department id
    location (str, optional): Filter by location
    is_enrolled (bool, optional): Filter for departments with enrolled users
    start_date (date, optional): Filter by learner join date (start range)
    end_date (date, optional): Filter by learner join date (end range)

Returns:
    A paginated list of departments with comprehensive metrics.

# paths./api/departments/orgs/{org}/.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/departments/orgs/{org}/.get.parameters[].description
Departments search string. Single string or list of strings. e.g 'sample_department' or `['department', 'another department']` 

# paths./api/departments/orgs/{org}/.get.parameters[].description
Filter by learners date_joined. Start date. ISO 8601

# paths./api/departments/orgs/{org}/.get.parameters[].description
Filter for users who have at least an enro;lment

# paths./api/departments/orgs/{org}/.get.parameters[].description
Filter by learners date_joined. Start date. ISO 8601

# paths./api/engagement/orgs/{org}/activity.get.description
Get engagement metrics on a per-course basis.

This endpoint provides a paginated list of courses with engagement metrics
including activity counts, time spent, and interaction data.

Query Parameters:
    page (int, optional): Page number for pagination
    length (int, optional): Number of items per page

Returns:
    A paginated list of courses with their engagement metrics.

# paths./api/engagement/orgs/{org}/activity.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/engagement/orgs/{org}/course_completion/over-time.get.description
Completion count per user per course across the platform

Query Params
1. start_date e.g 2020-10-01
2. end_date e.g 2020-10-10

Default result when no query param is added is last_7_days (today inclusive)

# paths./api/engagement/orgs/{org}/course_completion/over-time.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/engagement/orgs/{org}/course_completion/per-course.get.description
List course completion metrics on a per-course basis.

This endpoint provides a paginated table of courses with enrollment and
completion statistics for each course.

Returns:
    A paginated list of courses with:
    - Course identification (ID and name)
    - Enrollment count
    - Completion count
    - Average completion rate

# paths./api/engagement/orgs/{org}/course_completion/per-course.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/engagement/orgs/{org}/courses/{course_id}/time/average.get.description
Average time spent in secs on a per-day basis

Query Params
1. start_date e.g 2020-10-01
2. end_date e.g 2020-10-10
3. course_id <optional>

Default result when no query param is added is last_7_days (today inclusive)

# paths./api/engagement/orgs/{org}/courses/{course_id}/time/average.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/engagement/orgs/{org}/courses/{course_id}/time/detail.get.description
Time spent per course in secs in a tree like form

Kwargs
course_id e.g course-v1:Org+Course4+Run

Query Params
1. start_date <optional> e.g 2020-10-01
2. end_date <optional> e.g 2020-10-10

# paths./api/engagement/orgs/{org}/courses/{course_id}/time/detail.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/engagement/orgs/{org}/courses/{course_id}/time/over-time.get.description
Time spent per course in secs on a per-day basis

Query Params
1. start_date e.g 2020-10-01
2. end_date e.g 2020-10-10
Kwargs
3. course_id

Default result when no query param is added is last_7_days (today inclusive)

# paths./api/engagement/orgs/{org}/courses/{course_id}/time/over-time.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/engagement/orgs/{org}/courses/{course_id}/time/users.get.description
Time spent by users in a course

Query Params
course_id  e.g course-v1:Org+Course4+Run

# paths./api/engagement/orgs/{org}/courses/{course_id}/time/users.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/engagement/orgs/{org}/courses/{course_id}/time/users/{user_.get.description
Time spent within a course in ordered hierarchical format

Kwargs
1. course_id  e.g course-v1:Org+Course4+Run
2. user_id e.g developer@ibleducation.com or dev123 (username|email)
Query Params
3. start_date <optional> e.g 2020-10-01
4. end_date <optional> e.g 2020-10-10

# paths./api/engagement/orgs/{org}/courses/{course_id}/time/users/{user_.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/engagement/orgs/{org}/courses/{course_id}/time/users/{user_.get.description
Time spent in secs on a per-day basis

Query Params
1. course_id <optional> e.g course-v1:Org+Course4+Run
2. user_id <optional> e.g developer@ibleducation.com or dev123 (username|email)
3. start_date e.g 2020-10-01
4. end_date e.g 2020-10-10

Default result when no query param is added is last_7_days (today inclusive)

# paths./api/engagement/orgs/{org}/courses/{course_id}/time/users/{user_.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/engagement/orgs/{org}/courses/{course_id}/videos/.get.description
Get video engagement metrics for a specific course.

This endpoint provides detailed video engagement statistics for a single course,
including view counts, completion rates, and time spent on videos.

Query Parameters:
    course_id (str): The course ID to get video engagement data for

Returns:
    Detailed video engagement metrics for the specified course.

# paths./api/engagement/orgs/{org}/courses/{course_id}/videos/.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/engagement/orgs/{org}/courses/{course_id}/videos/over-time.get.description
Get video watch counts over time.

This endpoint provides daily counts of videos watched over a specified time period,
with options to filter by course or user.

Query Parameters:
    start_date (str, optional): Start date for the time range (ISO format)
    end_date (str, optional): End date for the time range (ISO format)
    course_id (str, optional): Filter by course ID
    user_id (str, optional): Filter by username or email

Returns:
    Daily video watch counts over the specified time period.

Default time range is the last 7 days if no dates are specified.

Access Control:
    - Platform admins can access any video watch data
    - Learners can access their own video watch data

# paths./api/engagement/orgs/{org}/courses/{course_id}/videos/over-time.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/engagement/orgs/{org}/courses/{course_id}/videos/summary.get.description
Get a summary of video watch statistics for a specific course.

This endpoint provides a structured summary of video watch data for a course,
organized in a tree-like format by course sections and subsections.

Query Parameters:
    course_id (str): The course ID to get video summary for

Returns:
    A hierarchical structure of video watch data for the course, including:
    - Section and subsection organization
    - Video identification and metadata
    - Watch counts and completion rates

# paths./api/engagement/orgs/{org}/courses/{course_id}/videos/summary.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/engagement/orgs/{org}/courses/{course_id}/videos/users.get.description
List of users' videos completed records for a specific course

Kwargs
course_id  e.g course-v1:Org+Course4+Run

# paths./api/engagement/orgs/{org}/courses/{course_id}/videos/users.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/engagement/orgs/{org}/time/average-perlearner-percourse.get.description
Average time spent by a learner in enrolled courses. Gives a rough estimate of whats the average time
that would be spent by a learner in a course

Query Params
1. start_date e.g 2020-10-01
2. end_date e.g 2020-10-10

# paths./api/engagement/orgs/{org}/time/average-perlearner-percourse.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/engagement/orgs/{org}/time/average-with-over-time.get.description
Average time spent in secs on a per-day basis

Query Params
1. start_date e.g 2020-10-01
2. end_date e.g 2020-10-10
3. course_id <optional>

Default result when no query param is added is last_7_days (today inclusive)

# paths./api/engagement/orgs/{org}/time/average-with-over-time.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/engagement/orgs/{org}/time/over-time.get.description
Get time spent on the platform over time.

This endpoint provides daily time spent values (in seconds) across the
platform over a specified time period.

Query Parameters:
    start_date (str, optional): Start date for the time range (ISO format)
    end_date (str, optional): End date for the time range (ISO format)

Returns:
    Daily time spent values over the specified time period, with change metrics
    compared to previous periods.

Default time range is the last 7 days if no dates are specified.

# paths./api/engagement/orgs/{org}/time/over-time.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/engagement/orgs/{org}/time/per-course.get.description
Get time spent statistics on a per-course basis.

This endpoint provides a paginated list of courses with the total time
spent by users in each course.

Query Parameters:
    start_date (str, optional): Start date for filtering (ISO format)
    end_date (str, optional): End date for filtering (ISO format)
    page (int, optional): Page number for pagination
    length (int, optional): Number of items per page

Returns:
    A paginated list of courses with:
    - Course identification (ID and name)
    - Total time spent (in seconds)
    - Formatted time spent (human-readable)
    - Percentage of total platform time

# paths./api/engagement/orgs/{org}/time/per-course.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/engagement/orgs/{org}/videos/.get.description
Get video engagement metrics on a per-course basis.

This endpoint provides a paginated list of courses with video engagement metrics
including view counts, completion rates, and time spent on videos.

Query Parameters:
    page (int, optional): Page number for pagination
    length (int, optional): Number of items per page

Returns:
    A paginated list of courses with their video engagement metrics.

# paths./api/engagement/orgs/{org}/videos/.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/engagement/orgs/{org}/videos/over-time.get.description
Get video watch counts over time.

This endpoint provides daily counts of videos watched over a specified time period,
with options to filter by course or user.

Query Parameters:
    start_date (str, optional): Start date for the time range (ISO format)
    end_date (str, optional): End date for the time range (ISO format)
    course_id (str, optional): Filter by course ID
    user_id (str, optional): Filter by username or email

Returns:
    Daily video watch counts over the specified time period.

Default time range is the last 7 days if no dates are specified.

Access Control:
    - Platform admins can access any video watch data
    - Learners can access their own video watch data

# paths./api/engagement/orgs/{org}/videos/over-time.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/exim/manage/eligibility/.get.description
Admin-only CRUD for CourseExportEligibility records.

Lookup is by primary key. Filter by ``is_enabled`` and
``course__course_id``; search by ``course__course_id``.

# paths./api/exim/manage/eligibility/.post.description
Admin-only CRUD for CourseExportEligibility records.

Lookup is by primary key. Filter by ``is_enabled`` and
``course__course_id``; search by ``course__course_id``.

# paths./api/exim/manage/eligibility/{id}/.get.description
Admin-only CRUD for CourseExportEligibility records.

Lookup is by primary key. Filter by ``is_enabled`` and
``course__course_id``; search by ``course__course_id``.

# paths./api/exim/manage/eligibility/{id}/.get.parameters[].description
A unique integer value identifying this course export eligibility.

# paths./api/exim/manage/eligibility/{id}/.put.description
Admin-only CRUD for CourseExportEligibility records.

Lookup is by primary key. Filter by ``is_enabled`` and
``course__course_id``; search by ``course__course_id``.

# paths./api/exim/manage/eligibility/{id}/.put.parameters[].description
A unique integer value identifying this course export eligibility.

# paths./api/exim/manage/eligibility/{id}/.patch.description
Admin-only CRUD for CourseExportEligibility records.

Lookup is by primary key. Filter by ``is_enabled`` and
``course__course_id``; search by ``course__course_id``.

# paths./api/exim/manage/eligibility/{id}/.patch.parameters[].description
A unique integer value identifying this course export eligibility.

# paths./api/exim/manage/eligibility/{id}/.delete.description
Admin-only CRUD for CourseExportEligibility records.

Lookup is by primary key. Filter by ``is_enabled`` and
``course__course_id``; search by ``course__course_id``.

# paths./api/exim/manage/eligibility/{id}/.delete.parameters[].description
A unique integer value identifying this course export eligibility.

# paths./api/exim/manage/environments/{id}/.get.parameters[].description
A unique integer value identifying this export target environment.

# paths./api/exim/manage/environments/{id}/.put.parameters[].description
A unique integer value identifying this export target environment.

# paths./api/exim/manage/environments/{id}/.patch.parameters[].description
A unique integer value identifying this export target environment.

# paths./api/exim/manage/environments/{id}/.delete.parameters[].description
A unique integer value identifying this export target environment.

# paths./api/exim/manage/platform-migrations/.get.description
Start and poll tenant-data migration runs (the platform_migration lane).

``POST`` starts a run and returns its ``run_id`` (kicking the Celery task);
``GET`` list/detail surface status + progress + report. Detail lookup is by
the public ``run_id`` UUID, not the surrogate PK. Gated by the
feature flag — start is rejected with 503 on non-AI deployments.

# paths./api/exim/manage/platform-migrations/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/exim/manage/platform-migrations/.get.parameters[].description
* `pending` - Pending
* `in_progress` - In Progress
* `completed` - Completed
* `failed` - Failed
* `canceled` - Canceled

# paths./api/exim/manage/platform-migrations/.post.description
Start and poll tenant-data migration runs (the platform_migration lane).

``POST`` starts a run and returns its ``run_id`` (kicking the Celery task);
``GET`` list/detail surface status + progress + report. Detail lookup is by
the public ``run_id`` UUID, not the surrogate PK. Gated by the
feature flag — start is rejected with 503 on non-AI deployments.

# paths./api/exim/manage/platform-migrations/{run_id}/.get.description
Start and poll tenant-data migration runs (the platform_migration lane).

``POST`` starts a run and returns its ``run_id`` (kicking the Celery task);
``GET`` list/detail surface status + progress + report. Detail lookup is by
the public ``run_id`` UUID, not the surrogate PK. Gated by the
feature flag — start is rejected with 503 on non-AI deployments.

# paths./api/exim/manage/platform-migrations/{run_id}/cancel/.post.description
Cancel a still-pending run. No-op for any other status.

Conditional UPDATE so we don't race the worker: if it has already flipped
the row to ``in_progress`` the UPDATE matches zero rows and we return 409.
A run already executing is not interrupted mid-phase.

# paths./api/exim/manage/platform-migrations/{run_id}/download/.get.description
Stream a completed export's bundle as a single ``.zip``.

Token-gated (IsDMAdmin) REST mirror of the admin "Download .zip" link, so
a programmatic caller can pull the bundle down to move it to another
deployment. Only a completed EXPORT with a bundle still on disk is
downloadable; imports and not-yet-finished runs have nothing to stream.

# paths./api/exim/manage/platform-migrations/import-upload/.post.description
Upload a bundle ``.zip`` and start an import run from it (API parity).

The programmatic mirror of the admin "Import from uploaded ZIP" page, so a
caller that pulled a bundle off one deployment can push it to another over
the API alone. Multipart fields: ``bundle_file`` (the zip, required),
``target_key`` (required), optional ``selected_components`` (repeatable),
``admin_user``, ``email``.

On an S3 deployment the validated bundle is stored to S3 and the import
runs from there (any node can execute it); otherwise it stays on local
disk like the admin flow.

# paths./api/exim/manage/tasks/.get.description
Admin-only read-only access to EximTask records.

Tasks are created by signals and the admin sync action; this API
surfaces them for inspection only. The ``cancel`` action transitions
a still-pending task to ``canceled`` so it gets skipped by the worker.

# paths./api/exim/manage/tasks/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/exim/manage/tasks/.get.parameters[].description
* `pending` - Pending
* `in_progress` - In Progress
* `completed` - Completed
* `failed` - Failed
* `canceled` - Canceled

# paths./api/exim/manage/tasks/{id}/.get.description
Admin-only read-only access to EximTask records.

Tasks are created by signals and the admin sync action; this API
surfaces them for inspection only. The ``cancel`` action transitions
a still-pending task to ``canceled`` so it gets skipped by the worker.

# paths./api/exim/manage/tasks/{id}/.get.parameters[].description
A unique integer value identifying this exim task.

# paths./api/exim/manage/tasks/{id}/cancel/.post.description
Cancel a pending task. No-op for any other status.

Uses a conditional UPDATE so that we don't race with the worker:
if the worker has just locked the row and flipped status to
``in_progress``, the UPDATE matches zero rows and we return 409
instead of overwriting the worker's transition.

# paths./api/exim/manage/tasks/{id}/cancel/.post.parameters[].description
A unique integer value identifying this exim task.

# paths./api/features/apps/.get.description
Returns a list of the apps that the user has access to.

# paths./api/features/apps/.get.parameters[].description
A page number within the paginated result set.

# paths./api/features/apps/update/.post.description
Updates the user onboarding completed status

# paths./api/features/apps/update-trial-status/.post.description
Activates free trial for the user

Set free_trial_started to True| false for the user app

App URL or ID is required as well as the platform key

# paths./api/features/bulk-config/.post.description
POST
Bulk update user feature config

NOTE: Will not create user feature configs

Params:
platform_key

config
(OR)
feature
values

# paths./api/features/config/.get.description
Query user feature config

Params:
user_id/username/email
platform_key

# paths./api/features/config/.post.description
POST
Update user feature config

Params:
user_id/username/email
platform_key

config
(OR)
feature
values

# paths./api/media/orgs/{org}/users/{user_id}/media/media-resources/.get.description
List and filter media resources. Supports filtering by course_id, unit_id, item_id and searching across multiple fields.

# paths./api/media/orgs/{org}/users/{user_id}/media/media-resources/.get.parameters[].description
Filter by course ID (e.g., course-v1:main+NB101+2025-T1)

# paths./api/media/orgs/{org}/users/{user_id}/media/media-resources/.get.parameters[].description
A page number within the paginated result set.

# paths./api/media/orgs/{org}/users/{user_id}/media/media-resources/.get.parameters[].description
Search across title, description, course_id, unit_id, item_id, and file_url

# paths./api/media/orgs/{org}/users/{user_id}/media/media-resources/.post.description
List and filter media resources. Supports filtering by course_id, unit_id, item_id and searching across multiple fields.

# paths./api/media/orgs/{org}/users/{user_id}/media/media-resources/.post.parameters[].description
Filter by course ID (e.g., course-v1:main+NB101+2025-T1)

# paths./api/media/orgs/{org}/users/{user_id}/media/media-resources/.post.parameters[].description
Search across title, description, course_id, unit_id, item_id, and file_url

# paths./api/media/orgs/{org}/users/{user_id}/media/media-resources/{id}.get.description
List and filter media resources. Supports filtering by course_id, unit_id, item_id and searching across multiple fields.

# paths./api/media/orgs/{org}/users/{user_id}/media/media-resources/{id}.get.parameters[].description
Filter by course ID (e.g., course-v1:main+NB101+2025-T1)

# paths./api/media/orgs/{org}/users/{user_id}/media/media-resources/{id}.get.parameters[].description
A unique integer value identifying this Media Resource.

# paths./api/media/orgs/{org}/users/{user_id}/media/media-resources/{id}.get.parameters[].description
Search across title, description, course_id, unit_id, item_id, and file_url

# paths./api/media/orgs/{org}/users/{user_id}/media/media-resources/{id}.put.description
List and filter media resources. Supports filtering by course_id, unit_id, item_id and searching across multiple fields.

# paths./api/media/orgs/{org}/users/{user_id}/media/media-resources/{id}.put.parameters[].description
Filter by course ID (e.g., course-v1:main+NB101+2025-T1)

# paths./api/media/orgs/{org}/users/{user_id}/media/media-resources/{id}.put.parameters[].description
A unique integer value identifying this Media Resource.

# paths./api/media/orgs/{org}/users/{user_id}/media/media-resources/{id}.put.parameters[].description
Search across title, description, course_id, unit_id, item_id, and file_url

# paths./api/media/orgs/{org}/users/{user_id}/media/media-resources/{id}.patch.description
List and filter media resources. Supports filtering by course_id, unit_id, item_id and searching across multiple fields.

# paths./api/media/orgs/{org}/users/{user_id}/media/media-resources/{id}.patch.parameters[].description
Filter by course ID (e.g., course-v1:main+NB101+2025-T1)

# paths./api/media/orgs/{org}/users/{user_id}/media/media-resources/{id}.patch.parameters[].description
A unique integer value identifying this Media Resource.

# paths./api/media/orgs/{org}/users/{user_id}/media/media-resources/{id}.patch.parameters[].description
Search across title, description, course_id, unit_id, item_id, and file_url

# paths./api/media/orgs/{org}/users/{user_id}/media/media-resources/{id}.delete.description
List and filter media resources. Supports filtering by course_id, unit_id, item_id and searching across multiple fields.

# paths./api/media/orgs/{org}/users/{user_id}/media/media-resources/{id}.delete.parameters[].description
Filter by course ID (e.g., course-v1:main+NB101+2025-T1)

# paths./api/media/orgs/{org}/users/{user_id}/media/media-resources/{id}.delete.parameters[].description
A unique integer value identifying this Media Resource.

# paths./api/media/orgs/{org}/users/{user_id}/media/media-resources/{id}.delete.parameters[].description
Search across title, description, course_id, unit_id, item_id, and file_url

# paths./api/media/orgs/{org}/users/{user_id}/media/media-resources/by_i.get.description
Get media resources for a specific item. The item_type determines which resources are returned based on the provided item_id.

# paths./api/media/orgs/{org}/users/{user_id}/media/media-resources/by_i.get.parameters[].description
Filter by course ID (e.g., course-v1:main+NB101+2025-T1)

# paths./api/media/orgs/{org}/users/{user_id}/media/media-resources/by_i.get.parameters[].description
Type of item. Valid values: course, unit, resource, course_unit, course_resource, unit_resource, all

# paths./api/media/orgs/{org}/users/{user_id}/media/media-resources/by_i.get.parameters[].description
Search across title, description, course_id, unit_id, item_id, and file_url

# paths./api/media/orgs/{org}/users/{user_id}/media/media-resources/by_i.get.responses.200.description
Successfully retrieved media resources for item

# paths./api/media/orgs/{org}/users/{user_id}/media/media-resources/sear.get.description
Search media resources by title, description, or IDs. Supports filtering results by course_id, unit_id, and item_id.

# paths./api/media/orgs/{org}/users/{user_id}/media/media-resources/sear.get.parameters[].description
Search across title, description, course_id, unit_id, item_id, and file_url

# paths./api/notification/v1/campaigns/unsubscribe/{unsubscribe_hash}/.get.description
Unsubscribe from a campaign using a hash

# paths./api/notification/v1/orgs/{org}/notifications/.get.parameters[].description
Comma-separated tags to filter by (e.g. 'learning,activity'). Returns notifications whose template matches ANY of the given tags.

# paths./api/notification/v1/orgs/{org}/notifications/bulk-update/.patch.description
Bulk update notification status for a user. Requires: Ibl.Notifications/Notification/write

# paths./api/notification/v1/orgs/{org}/users/{user_id}/notifications/.get.parameters[].description
Comma-separated tags to filter by (e.g. 'learning,activity'). Returns notifications whose template matches ANY of the given tags.

# paths./api/notification/v1/orgs/{org}/users/{user_id}/notifications-co.get.description
Get notifications count for a user. Requires: Ibl.Notifications/Notification/list

# paths./api/notification/v1/orgs/{org}/users/{user_id}/notifications-co.get.parameters[].description
Filter count by notification status

* `READ` - Read
* `UNREAD` - Unread
* `CANCELLED` - Cancelled

# paths./api/notification/v1/orgs/{org}/users/{user_id}/notifications/{n.delete.description
Delete a notification for a user. Requires: Ibl.Notifications/Notification/delete

# paths./api/notification/v1/orgs/{org}/users/{user_id}/notifications/bu.patch.description
Bulk update notification status for a user. Requires: Ibl.Notifications/Notification/write

# paths./api/notification/v1/orgs/{platform_key}/mark-all-as-read.post.description
Mark all notifications as read for a user. Optionally provide specific notification IDs. Requires: Ibl.Notifications/Notification/write

# paths./api/notification/v1/orgs/{platform_key}/notification-builder/{i.get.description
Get paginated list of recipients for a notification build

# paths./api/notification/v1/orgs/{platform_key}/notification-builder/co.get.description
Get all context data needed for notification building including templates, channels, and platforms

# paths./api/notification/v1/orgs/{platform_key}/notification-builder/pr.post.description
Preview notification recipients and get build ID for sending

# paths./api/notification/v1/orgs/{platform_key}/notification-builder/se.post.description
Send notifications to all recipients in a build

# paths./api/notification/v1/orgs/{platform_key}/notification-builder/va.post.description
Validate a single notification source (email, username, platform, csv)

# paths./api/notification/v1/platforms/{platform_key}/config/test-smtp/.post.description
Test SMTP credentials by sending a test email to the specified address. Requires: Ibl.Notifications/SMTP/action

# paths./api/notification/v1/platforms/{platform_key}/notification-prefe.get.description
Retrieve notification preferences for the authenticated user (or another user via ?username= for admins). Auto-creates preferences with defaults on first access. RBAC: Ibl.Notifications/Notification/read

# paths./api/notification/v1/platforms/{platform_key}/notification-prefe.get.parameters[].description
Comma-separated tags to filter by (e.g. 'learning,activity'). Returns types matching ANY tag.

# paths./api/notification/v1/platforms/{platform_key}/notification-prefe.get.parameters[].description
Username to manage preferences for (admin only). Defaults to authenticated user.

# paths./api/notification/v1/platforms/{platform_key}/notification-prefe.patch.parameters[].description
Comma-separated tags to filter by (e.g. 'learning,activity'). Returns types matching ANY tag.

# paths./api/notification/v1/platforms/{platform_key}/notification-prefe.patch.parameters[].description
Username to manage preferences for (admin only). Defaults to authenticated user.

# paths./api/notification/v1/platforms/{platform_key}/notification-prefe.get.description
Returns notification types enabled for this platform, annotated with the user's per-type preferences. RBAC: Ibl.Notifications/Notification/read

# paths./api/notification/v1/platforms/{platform_key}/notification-prefe.get.parameters[].description
Comma-separated tags to filter by (e.g. 'learning,activity'). Returns types matching ANY tag.

# paths./api/notification/v1/platforms/{platform_key}/notification-prefe.get.parameters[].description
Username to manage preferences for (admin only). Defaults to authenticated user.

# paths./api/notification/v1/platforms/{platform_key}/notification-prefe.patch.description
Set enabled/frequency for a single notification type. RBAC: Ibl.Notifications/Notification/write

# paths./api/notification/v1/platforms/{platform_key}/notification-prefe.patch.parameters[].description
Comma-separated tags to filter by (e.g. 'learning,activity'). Returns types matching ANY tag.

# paths./api/notification/v1/platforms/{platform_key}/notification-prefe.patch.parameters[].description
Username to manage preferences for (admin only). Defaults to authenticated user.

# paths./api/notification/v1/platforms/{platform_key}/templates/.get.description
Get all notification templates for the platform. Includes both platform-specific and inherited templates from main. Filter by tags with ?tags=learning,activity (comma-separated, OR logic). Requires permission: Ibl.Notifications/NotificationTemplate/list

# paths./api/notification/v1/platforms/{platform_key}/templates/.get.parameters[].description
Page number. When provided, response is paginated ({count, next, previous, results}). When omitted, returns a flat list.

# paths./api/notification/v1/platforms/{platform_key}/templates/.get.parameters[].description
Number of templates per page (default 25, max 100).

# paths./api/notification/v1/platforms/{platform_key}/templates/.get.parameters[].description
Comma-separated tags to filter by (e.g. 'learning,activity'). Returns templates matching ANY of the given tags.

# paths./api/notification/v1/platforms/{platform_key}/templates/{notific.get.description
Get detailed view of a notification template by type. Returns platform-specific template if exists, otherwise main template. Requires permission: Ibl.Notifications/NotificationTemplate/read

# paths./api/notification/v1/platforms/{platform_key}/templates/{notific.post.description
Delete platform-specific template override and revert to main template. Notification preference (on/off) is preserved. Requires permission: Ibl.Notifications/NotificationTemplate/write

# paths./api/notification/v1/platforms/{platform_key}/templates/{notific.post.description
Send a test notification to verify template rendering and delivery. Sends to the requesting admin's email or a specified test email. Requires permission: Ibl.Notifications/NotificationTemplate/action

# paths./api/notification/v1/platforms/{platform_key}/templates/{notific.patch.description
Enable or disable a notification type for the platform. This sets the NotificationPreference, not the template. Requires permission: Ibl.Notifications/NotificationTemplate/write

# paths./api/notification/v1/platforms/{platform_key}/templates/tags/.get.description
Get all unique tags used across notification templates for this platform. Useful for autocomplete / filter UIs. Requires permission: Ibl.Notifications/NotificationTemplate/list

# paths./api/orgs/{platform_key}/scim/v2/Groups.get.description
List all existing RBAC groups for the specified platform. Only returns groups that have been pre-created in the RBAC system.

# paths./api/orgs/{platform_key}/scim/v2/Groups.post.description
Add/remove users from an existing RBAC group for the specified platform. Does not create new groups.

# paths./api/orgs/{platform_key}/scim/v2/Groups/{id}.get.description
Get details of a specific existing RBAC group by unique ID for the specified platform

# paths./api/orgs/{platform_key}/scim/v2/Groups/{id}.put.description
Update an existing RBAC group's name, description, and members for the specified platform

# paths./api/orgs/{platform_key}/scim/v2/Groups/{id}.patch.description
Partially update an existing RBAC group's name, description, and members for the specified platform using PATCH method

# paths./api/orgs/{platform_key}/scim/v2/Groups/{id}.delete.description
Delete an existing RBAC group from the system

# paths./api/orgs/{platform_key}/scim/v2/Groups/{id}/.get.description
Get details of a specific existing RBAC group by unique ID for the specified platform

# paths./api/orgs/{platform_key}/scim/v2/Groups/{id}/.put.description
Update an existing RBAC group's name, description, and members for the specified platform

# paths./api/orgs/{platform_key}/scim/v2/Groups/{id}/.patch.description
Partially update an existing RBAC group's name, description, and members for the specified platform using PATCH method

# paths./api/orgs/{platform_key}/scim/v2/Groups/{id}/.delete.description
Delete an existing RBAC group from the system

# paths./api/orgs/{platform_key}/scim/v2/Groups/{id}/add_members.post.description
Add members to an existing RBAC group using SCIM patch operations

# paths./api/orgs/{platform_key}/scim/v2/Groups/{id}/remove_members.post.description
Remove members from an existing RBAC group using SCIM patch operations

# paths./api/orgs/{platform_key}/scim/v2/Groups/{id}/remove_members.post.summary
Remove members from an existing RBAC group

# paths./api/orgs/{platform_key}/scim/v2/Users.get.description
List users in the system for the specified platform

# paths./api/orgs/{platform_key}/scim/v2/Users.post.description
Create a new user in the system for the specified platform

# paths./api/orgs/{platform_key}/scim/v2/Users.post.responses.400.content.application/scim+json.schema.description
Invalid request - missing required fields or invalid data

# paths./api/orgs/{platform_key}/scim/v2/Users.post.responses.400.content.application/json.schema.description
Invalid request - missing required fields or invalid data

# paths./api/orgs/{platform_key}/scim/v2/Users/{id}.get.description
Get details of a specific user by ID for the specified platform

# paths./api/orgs/{platform_key}/scim/v2/Users/{id}.get.responses.400.content.application/scim+json.schema.description
Invalid request - missing required fields or invalid data

# paths./api/orgs/{platform_key}/scim/v2/Users/{id}.get.responses.400.content.application/json.schema.description
Invalid request - missing required fields or invalid data

# paths./api/orgs/{platform_key}/scim/v2/Users/{id}.put.description
Update a user for the specified platform

# paths./api/orgs/{platform_key}/scim/v2/Users/{id}.patch.description
Partially update an existing user's information using PATCH method

# paths./api/orgs/{platform_key}/scim/v2/Users/{id}.delete.description
Delete a user for the specified platform (not supported)

# paths./api/orgs/{platform_key}/scim/v2/Users/{id}.delete.responses.405.content.application/scim+json.schema.description
Method not allowed - User deletion is not supported via SCIM

# paths./api/orgs/{platform_key}/scim/v2/Users/{id}.delete.responses.405.content.application/json.schema.description
Method not allowed - User deletion is not supported via SCIM

# paths./api/orgs/{platform_key}/scim/v2/Users/{id}/.get.description
Get details of a specific user by ID for the specified platform

# paths./api/orgs/{platform_key}/scim/v2/Users/{id}/.get.responses.400.content.application/scim+json.schema.description
Invalid request - missing required fields or invalid data

# paths./api/orgs/{platform_key}/scim/v2/Users/{id}/.get.responses.400.content.application/json.schema.description
Invalid request - missing required fields or invalid data

# paths./api/orgs/{platform_key}/scim/v2/Users/{id}/.put.description
Update a user for the specified platform

# paths./api/orgs/{platform_key}/scim/v2/Users/{id}/.patch.description
Partially update an existing user's information using PATCH method

# paths./api/orgs/{platform_key}/scim/v2/Users/{id}/.delete.description
Delete a user for the specified platform (not supported)

# paths./api/orgs/{platform_key}/scim/v2/Users/{id}/.delete.responses.405.content.application/scim+json.schema.description
Method not allowed - User deletion is not supported via SCIM

# paths./api/orgs/{platform_key}/scim/v2/Users/{id}/.delete.responses.405.content.application/json.schema.description
Method not allowed - User deletion is not supported via SCIM

# paths./api/overview/orgs/{org}/active-users.get.description
Get active user counts over time.

This endpoint provides daily counts of active users (users with known activity)
over a specified time period.

Query Parameters:
    start_date (str, optional): Start date for the time range (ISO format)
    end_date (str, optional): End date for the time range (ISO format)

Returns:
    Daily active user counts over the specified time period, with change metrics
    compared to previous periods.

Default time range is the last 7 days if no dates are specified.

An active user is defined as a user with any activity within the past 30 days.

# paths./api/overview/orgs/{org}/active-users.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/overview/orgs/{org}/average-grade.get.description
Get average grade value for platform, course, or user.

This endpoint returns the average grade at different levels:
- Platform level: Average grade across all courses
- Course level: Average grade for a specific course
- Learner level: Average grade for a specific learner
- Course-learner level: Grade for a specific learner in a specific course

Query Parameters:
    course_id (str, optional): Filter by course ID
    learner_id (str, optional): Filter by username or email

Returns:
    The average grade value based on the specified filters.

Access Control:
    - Platform admins can access any grade data
    - Learners can access their own grade data

# paths./api/overview/orgs/{org}/average-grade.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/overview/orgs/{org}/courses/completions.get.description
Get course completion summary metrics over time.

This endpoint provides completion statistics across the platform over a
specified time period, including daily completion counts and overall metrics.

Query Parameters:
    start_date (str): Start date for the time range (ISO format)
    end_date (str): End date for the time range (ISO format)

Returns:
    Completion data including:
    - Daily completion counts over time
    - Total unique user count
    - Total completion count
    - Completion percentage
    - Change metrics compared to previous periods

Default time range is the last 7 days if no dates are specified.

# paths./api/overview/orgs/{org}/courses/completions.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/overview/orgs/{org}/learners.get.description
List all learners on the platform with aggregated metrics.

This endpoint returns a paginated list of all learners with key metrics including:
- Enrollment counts
- Completion counts
- Time spent on platform

Query Parameters:
    page (int): Page number for pagination
    length (int): Number of items per page
    search (str): Filter learners by username, email, or name

Returns:
    A paginated list of learners with their associated metrics.

# paths./api/overview/orgs/{org}/learners.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/overview/orgs/{org}/most-active-courses.get.description
Get time spent statistics on a per-course basis.

This endpoint provides a paginated list of courses with the total time
spent by users in each course.

Query Parameters:
    start_date (str, optional): Start date for filtering (ISO format)
    end_date (str, optional): End date for filtering (ISO format)
    page (int, optional): Page number for pagination
    length (int, optional): Number of items per page

Returns:
    A paginated list of courses with:
    - Course identification (ID and name)
    - Total time spent (in seconds)
    - Formatted time spent (human-readable)
    - Percentage of total platform time

# paths./api/overview/orgs/{org}/most-active-courses.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/overview/orgs/{org}/registered-users.get.description
Get registered user counts over time.

This endpoint provides daily counts of new user registrations over a
specified time period.

Query Parameters:
    start_date (str, optional): Start date for the time range (ISO format)
    end_date (str, optional): End date for the time range (ISO format)

Returns:
    Daily registration counts over the specified time period, with change metrics
    compared to previous periods.

Default time range is the last 7 days if no dates are specified.

# paths./api/overview/orgs/{org}/registered-users.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/performance/orgs/{org}/courses/{course_id}/grading/average.get.description
Get average grade value for platform, course, or user.

This endpoint returns the average grade at different levels:
- Platform level: Average grade across all courses
- Course level: Average grade for a specific course
- Learner level: Average grade for a specific learner
- Course-learner level: Grade for a specific learner in a specific course

Query Parameters:
    course_id (str, optional): Filter by course ID
    learner_id (str, optional): Filter by username or email

Returns:
    The average grade value based on the specified filters.

Access Control:
    - Platform admins can access any grade data
    - Learners can access their own grade data

# paths./api/performance/orgs/{org}/courses/{course_id}/grading/average.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/performance/orgs/{org}/courses/{course_id}/grading/average-.get.description
Returns average course grade and grade cuttoff

e.g
```
{
    "data": {
        "grade_cutoffs": {
            "A": 90,
            "B": 80,
            "C": 70,
        },
        "average_grade": 50.0,
    }
}
```

Kwargs
course_id

# paths./api/performance/orgs/{org}/courses/{course_id}/grading/average-.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/performance/orgs/{org}/courses/{course_id}/grading/detail.get.description
Grading summary for the entire course overview in a tree-like format

Kwargs
course_id <required>

# paths./api/performance/orgs/{org}/courses/{course_id}/grading/detail.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/performance/orgs/{org}/courses/{course_id}/grading/per-lear.get.description
Grading information per enrolled user in a course

Kwargs
course_id <required>

# paths./api/performance/orgs/{org}/courses/{course_id}/grading/per-lear.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/performance/orgs/{org}/courses/{course_id}/grading/summary.get.description
Returns average grades across various assignment types in a course

Query Params
course_id

Returns:
    dict
    {
        "data": [
            {
                "assignment_type': <str>,
                "weight": <float>,
                "average_weighted_grade": <float>,
                "average_section_grade": <float>
            }, ...
        ]
    }

# paths./api/performance/orgs/{org}/courses/{course_id}/grading/summary.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/performance/orgs/{org}/grading/average.get.description
Get average grade value for platform, course, or user.

This endpoint returns the average grade at different levels:
- Platform level: Average grade across all courses
- Course level: Average grade for a specific course
- Learner level: Average grade for a specific learner
- Course-learner level: Grade for a specific learner in a specific course

Query Parameters:
    course_id (str, optional): Filter by course ID
    learner_id (str, optional): Filter by username or email

Returns:
    The average grade value based on the specified filters.

Access Control:
    - Platform admins can access any grade data
    - Learners can access their own grade data

# paths./api/performance/orgs/{org}/grading/average.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/performance/orgs/{org}/grading/per-course.get.description
List grade-related performance data for all courses.

This endpoint provides a comprehensive view of grade performance across
courses, including enrollment counts, pass rates, and average grades.

Returns:
    A paginated list of courses with:
    - Course identification (ID and name)
    - Enrollment count
    - Number of students who passed
    - Average grade

# paths./api/performance/orgs/{org}/grading/per-course.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/perlearner/orgs/{org}/learners.get.description
Enhanced API endpoint for listing learners with comprehensive filtering.

This endpoint provides a paginated list of learners with detailed metrics
and supports advanced filtering options. It uses DM token authentication
and respects department-based access controls.

Query Parameters:
    page (int): Page number for pagination
    length (int): Number of items per page
    search (str): Filter by username, email, or full name
    program (str): Filter by program
    location (str): Filter by location
    is_enrolled (bool): Filter for users with enrollments
    platform (str): Filter by platform
    start_date (date): Filter by join date (start range)
    end_date (date): Filter by join date (end range)

Returns:
    A paginated list of learners with comprehensive metrics including:
    - Course enrollments and completions
    - Time spent on platform
    - Pathway progress
    - Certificate and skill information
    - Location data

Access Control:
    - Platform admins can see all learners
    - Department admins can only see learners in their departments

# paths./api/perlearner/orgs/{org}/learners.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/perlearner/orgs/{org}/learners.get.parameters[].description
Filter for users who have at least an enrollment

# paths./api/perlearner/orgs/{org}/learners.get.parameters[].description
Search string for learner. email, username or full name

# paths./api/perlearner/orgs/{org}/learners.get.parameters[].description
Learner date_joined start date. ISO 8601

# paths./api/perlearner/orgs/{org}/users.get.description
List all learners on the platform with aggregated metrics.

This endpoint returns a paginated list of all learners with key metrics including:
- Enrollment counts
- Completion counts
- Time spent on platform

Query Parameters:
    page (int): Page number for pagination
    length (int): Number of items per page
    search (str): Filter learners by username, email, or name

Returns:
    A paginated list of learners with their associated metrics.

# paths./api/perlearner/orgs/{org}/users.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/perlearner/orgs/{org}/users/{user_id}/activity/.get.description
Provides information on user enrollments

Params
user_id e.g developer@ibleducation.com| developer

# paths./api/perlearner/orgs/{org}/users/{user_id}/activity/.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/perlearner/orgs/{org}/users/{user_id}/courses/{course_id}/g.get.description
Provides about a learner current grade in a course with the course cut
Kwargs
1. course_id e.g course-v1:Org+Course4+Run
2. user_id e.g developer@ibleducation.com or dev123 (username|email)

# paths./api/perlearner/orgs/{org}/users/{user_id}/courses/{course_id}/g.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/perlearner/orgs/{org}/users/{user_id}/courses/{course_id}/g.get.description
DRF view mixin that routes all ORM reads to the read replica.

Falls back to the primary database if the replica is unreachable.

Add as the **first** base class on read-only views/viewsets::

    class MyView(ReadReplicaViewMixin, IsPlatformAdminDRFMixin, APIView):
        ...

# paths./api/perlearner/orgs/{org}/users/{user_id}/courses/{course_id}/g.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/perlearner/orgs/{org}/users/{user_id}/courses/{course_id}/g.get.description
Query Params
1. course_id e.g course-v1:Org+Course4+Run
2. user_id e.g developer@ibleducation.com or dev123 (username|email)

# paths./api/perlearner/orgs/{org}/users/{user_id}/courses/{course_id}/g.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/perlearner/orgs/{org}/users/{user_id}/courses/{course_id}/o.get.description
Average of days with atleast an activity within ENGAGEMENT_INDEX_PERIOD consecutive days for a learner in a course

# paths./api/perlearner/orgs/{org}/users/{user_id}/courses/{course_id}/o.get.description
Provides about a learner current grade in a course with the course cut
Kwargs
1. course_id e.g course-v1:Org+Course4+Run
2. user_id e.g developer@ibleducation.com or dev123 (username|email)

# paths./api/perlearner/orgs/{org}/users/{user_id}/courses/{course_id}/o.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/perlearner/orgs/{org}/users/{user_id}/courses/{course_id}/o.get.description
Evaluates performance index for platform, per course, per user and per user-per course

Query Params
course_id <optional>
learner_id <optional>

# paths./api/perlearner/orgs/{org}/users/{user_id}/courses/{course_id}/o.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/perlearner/orgs/{org}/users/{user_id}/courses/{course_id}/o.get.description
Time spent within a course in secs on a per-day basis

Kwargs
1. course_id  e.g course-v1:Org+Course4+Run
2. user_id e.g developer@ibleducation.com or dev123 (username|email)
Query Params
3. start_date e.g 2020-10-01
4. end_date e.g 2020-10-10

Default result when no query param is added is last_7_days (today inclusive)

# paths./api/perlearner/orgs/{org}/users/{user_id}/courses/{course_id}/o.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/perlearner/orgs/{org}/users/{user_id}/courses/{course_id}/v.get.description
List of videos within a course a learner has watched

Kwargs
1. course_id e.g course-v1:Org+Course4+Run
2. user_id e.g developer@ibleducation.com or dev123 (username|email)

Default result when no query param is added is [], 0

# paths./api/perlearner/orgs/{org}/users/{user_id}/courses/{course_id}/v.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/perlearner/orgs/{org}/users/{user_id}/courses/{course_id}/v.get.description
Get video watch counts over time.

This endpoint provides daily counts of videos watched over a specified time period,
with options to filter by course or user.

Query Parameters:
    start_date (str, optional): Start date for the time range (ISO format)
    end_date (str, optional): End date for the time range (ISO format)
    course_id (str, optional): Filter by course ID
    user_id (str, optional): Filter by username or email

Returns:
    Daily video watch counts over the specified time period.

Default time range is the last 7 days if no dates are specified.

Access Control:
    - Platform admins can access any video watch data
    - Learners can access their own video watch data

# paths./api/perlearner/orgs/{org}/users/{user_id}/courses/{course_id}/v.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/perlearner/orgs/{org}/users/{user_id}/grades/per-course.get.description
Summary Grading Information for a learner on a per-enrollment basis

Query Params
1. user_id e.g developer@ibleducation.com or dev123 (username|email)

# paths./api/perlearner/orgs/{org}/users/{user_id}/grades/per-course.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/perlearner/orgs/{org}/users/{user_id}/info.get.description
Retrieve detailed information about a specific learner.

This endpoint returns personal and activity information about a learner,
including profile data, activity metrics, and location information.

Path Parameters:
    user_id (str): The username or email of the learner

Query Parameters:
    meta (bool): Include additional analytics information when true

Returns:
    Detailed learner information including:
    - Profile data (username, name, email)
    - Registration and activity dates
    - Activity metrics (assessments, time spent, videos watched)
    - Location and browser information (when available)

Access Control:
    - Platform admins can access any learner
    - Learners can access their own information
    - Department admins can access learners in their departments

# paths./api/perlearner/orgs/{org}/users/{user_id}/info.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/perlearner/orgs/{org}/users/{user_id}/info.get.parameters[].description
Include extra analytics information?

* `y` - y
* `yes` - yes
* `true` - true
* `True` - True
* `n` - n
* `no` - no
* `false` - false
* `False` - False

# paths./api/perlearner/orgs/{org}/users/{user_id}/last-access.get.description
Last course accessed by a learner, includes upto unit information as well

# paths./api/perlearner/orgs/{org}/users/{user_id}/last-access.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/perlearner/orgs/{org}/users/{user_id}/overview/engagement-i.get.description
Average of days with atleast an activity within ENGAGEMENT_INDEX_PERIOD consecutive days

# paths./api/perlearner/orgs/{org}/users/{user_id}/overview/engagement-i.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/perlearner/orgs/{org}/users/{user_id}/overview/grades/avera.get.description
Get average grade value for platform, course, or user.

This endpoint returns the average grade at different levels:
- Platform level: Average grade across all courses
- Course level: Average grade for a specific course
- Learner level: Average grade for a specific learner
- Course-learner level: Grade for a specific learner in a specific course

Query Parameters:
    course_id (str, optional): Filter by course ID
    learner_id (str, optional): Filter by username or email

Returns:
    The average grade value based on the specified filters.

Access Control:
    - Platform admins can access any grade data
    - Learners can access their own grade data

# paths./api/perlearner/orgs/{org}/users/{user_id}/overview/grades/avera.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/perlearner/orgs/{org}/users/{user_id}/overview/performance-.get.description
Evaluates performance index for platform, per course, per user and per user-per course

Query Params
course_id <optional>
learner_id <optional>

# paths./api/perlearner/orgs/{org}/users/{user_id}/overview/performance-.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/perlearner/orgs/{org}/users/{user_id}/overview/time/over-ti.get.description
Time spent in secs on a per-day basis

Query Params
1. course_id <optional> e.g course-v1:Org+Course4+Run
2. user_id <optional> e.g developer@ibleducation.com or dev123 (username|email)
3. start_date e.g 2020-10-01
4. end_date e.g 2020-10-10

Default result when no query param is added is last_7_days (today inclusive)

# paths./api/perlearner/orgs/{org}/users/{user_id}/overview/time/over-ti.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/perlearner/orgs/{org}/users/{user_id}/videos/over-time.get.description
Get video watch counts over time.

This endpoint provides daily counts of videos watched over a specified time period,
with options to filter by course or user.

Query Parameters:
    start_date (str, optional): Start date for the time range (ISO format)
    end_date (str, optional): End date for the time range (ISO format)
    course_id (str, optional): Filter by course ID
    user_id (str, optional): Filter by username or email

Returns:
    Daily video watch counts over the specified time period.

Default time range is the last 7 days if no dates are specified.

Access Control:
    - Platform admins can access any video watch data
    - Learners can access their own video watch data

# paths./api/perlearner/orgs/{org}/users/{user_id}/videos/over-time.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/perlearner/orgs/{org}/users/{user_id}/videos/per-course.get.description
Summary Videos watched data for a learner per enrollment

Query Params
1. user_id e.g developer@ibleducation.com or dev123 (username|email)

# paths./api/perlearner/orgs/{org}/users/{user_id}/videos/per-course.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/platform/orgs/{org}/.get.description
Get a list of registered users on the platform.

This endpoint provides a list of all registered users with basic profile
information including username, name, email, and registration date.

Returns:
    A list of registered users with their profile information.

# paths./api/platform/orgs/{org}/courses/{course_id}/progress/.get.description
Completion information per enrolled user

Gives Percentage of units completed in course

Query Params
course_id <required>
user_id <optional>

# paths./api/platform/orgs/{org}/courses/{course_id}/progress/average-da.get.description
Average days used to complete a course

Query Params
    1. course_id <optional> e.g course-v1:Org+Course4+Run

# paths./api/platform/orgs/{org}/courses/{course_id}/progress/average-ti.get.description
Average time used to complete a course in secs

Query Params
    1. course_id <optional> e.g course-v1:Org+Course4+Run

# paths./api/platform/orgs/{org}/courses/{course_id}/progress/completed.get.description
Get completion count statistics.

This endpoint returns completion counts at different levels:
- Platform level: Total users who have completed at least one course
- Course level: Total completions for a specific course
- Learner level: Total courses completed by a specific learner

Query Parameters:
    course_id (str, optional): Filter by course ID
    user_id (str, optional): Filter by username or email

Returns:
    A count of completions based on the specified filters.

# paths./api/platform/orgs/{org}/courses/{course_id}/progress/in-progres.get.description
In Progress means any unit completion in the past 30 days

For platform :  Total users who have atleast a course in_progress on the platform
For course : Total users
For learner : Total courses in progress

Query Params
    1. course_id <optional> e.g course-v1:Org+Course4+Run
    2. user_id <optional> e.g developer@ibleducation.com or dev123 (username|email)

# paths./api/platform/orgs/{org}/courses/{course_id}/progress/started.get.description
Started means an enrollment

For platform :  Total users who have atleast an enrollment
For course : Total users enrolled
For learner : Total courses in progress

Query Params
    1. course_id <optional> e.g course-v1:Org+Course4+Run
    2. user_id <optional> e.g developer@ibleducation.com or dev123 (username|email)

# paths./api/platform/orgs/{org}/courses/{course_id}/users/{user_id}/gra.get.description
DRF view mixin that routes all ORM reads to the read replica.

Falls back to the primary database if the replica is unreachable.

Add as the **first** base class on read-only views/viewsets::

    class MyView(ReadReplicaViewMixin, IsPlatformAdminDRFMixin, APIView):
        ...

# paths./api/platform/orgs/{org}/courses/{course_id}/users/{user_id}/pro.get.description
Gives Percentage of units completed in course for a specific learner

# paths./api/platform/orgs/{org}/courses/{course_id}/users/{user_id}/pro.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/platform/orgs/{org}/courses/{course_id}/users/{user_id}/pro.get.description
Average days used to complete a course

Query Params
    1. course_id <optional> e.g course-v1:Org+Course4+Run

# paths./api/platform/orgs/{org}/courses/{course_id}/users/{user_id}/tim.get.description
Time spent count in seconds within a course by a learner

# paths./api/platform/orgs/{org}/courses/{course_id}/users/{user_id}/tim.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/platform/orgs/{org}/courses/{course_id}/users/{user_id}/vid.get.description
(Total videos watched / Total Course Videos) or Total Videos watched in a course by a learner

# paths./api/platform/orgs/{org}/courses/{course_id}/users/{user_id}/vid.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/platform/orgs/{org}/courses/{course_id}/videos/.get.description
Count of total videos in a course

Query Params
course_id  e.g course-v1:Org+Course4+Run

# paths./api/platform/orgs/{org}/courses/count.get.description
Get total count of courses on the platform.

This endpoint returns the total number of courses available on the platform.

Returns:
    The total count of courses on the platform.

# paths./api/platform/orgs/{org}/courses/count.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/platform/orgs/{org}/courses/grades.get.description
List grading information on a per-course basis.

This endpoint provides grading statistics for all courses, including
average grades and completion rates.

Returns:
    A list of courses with their associated grading metrics.

# paths./api/platform/orgs/{org}/courses/videos.get.description
Get video watch statistics on a per-course basis.

This endpoint provides a list of courses with aggregated video watch metrics,
including total views and completion percentages.

Returns:
    A list of courses with:
    - Course identification (ID and name)
    - Video watch count
    - Percentage of total videos watched

# paths./api/platform/orgs/{org}/courses/videos.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/platform/orgs/{org}/progress/completed.get.description
Get completion count statistics.

This endpoint returns completion counts at different levels:
- Platform level: Total users who have completed at least one course
- Course level: Total completions for a specific course
- Learner level: Total courses completed by a specific learner

Query Parameters:
    course_id (str, optional): Filter by course ID
    user_id (str, optional): Filter by username or email

Returns:
    A count of completions based on the specified filters.

# paths./api/platform/orgs/{org}/progress/in-progress.get.description
In Progress means any unit completion in the past 30 days

For platform :  Total users who have atleast a course in_progress on the platform
For course : Total users
For learner : Total courses in progress

Query Params
    1. course_id <optional> e.g course-v1:Org+Course4+Run
    2. user_id <optional> e.g developer@ibleducation.com or dev123 (username|email)

# paths./api/platform/orgs/{org}/progress/started.get.description
Started means an enrollment

For platform :  Total users who have atleast an enrollment
For course : Total users enrolled
For learner : Total courses in progress

Query Params
    1. course_id <optional> e.g course-v1:Org+Course4+Run
    2. user_id <optional> e.g developer@ibleducation.com or dev123 (username|email)

# paths./api/platform/orgs/{org}/time/count.get.description
Total time spent count on the platform within specified range or all time

Query Params
1. start_date e.g 2020-10-01
2. end_date e.g 2020-10-10

Default result is all time

# paths./api/platform/orgs/{org}/users/active/count.get.description
Get count of active users on the platform.

This endpoint returns the number of users who have had activity on the platform,
either for all time or within a specified date range.

Query Parameters:
    start_date (str, optional): Start date for filtering (ISO format)
    end_date (str, optional): End date for filtering (ISO format)

Returns:
    The count of active users and change metrics compared to previous periods.

Default behavior returns the count for all time if no date range is specified.

# paths./api/platform/orgs/{org}/users/active/count.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/platform/orgs/{org}/users/count.get.description
Get count of registered users on the platform.

This endpoint returns the number of users registered on the platform,
either for all time or within a specified date range.

Query Parameters:
    start_date (str, optional): Start date for filtering (ISO format)
    end_date (str, optional): End date for filtering (ISO format)

Returns:
    The count of registered users and change metrics compared to previous periods.

Default behavior returns the count for all time if no date range is specified.

# paths./api/platform/orgs/{org}/users/count.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/platform/orgs/{org}/users/courses-completed/count.get.description
Count of users who have completed a course on the platform within specified range or all time

Query Params
1. start_date e.g 2020-10-01
2. end_date e.g 2020-10-10

Default is all time

# paths./api/platform/orgs/{org}/users/courses-completed/count.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/provider-association/stripe/callback/{launch_id}/.get.description
Handle callbacks from Stripe after successful checkout.

Updates:
- Platform launch state
- Association configuration status

# paths./api/providers/apple/associate-account/.post.description
Associate an Apple account with a user known user

# paths./api/providers/apple/subscription-status/.post.description
Returns information about a user subscription status

# paths./api/providers/apple/validate-transaction-id/.post.description
Checks if a provided transaction_id is valid

# paths./api/providers/aws/create-organization/.post.description
Serves a view that redirects to the AWS marketplace create organization page

Set CREATE_ORGANIZATION_URL in GlobalConfigurationFetcher to the
URL of the AWS marketplace create organization page

# paths./api/providers/aws/launch-tenant/.post.description
Proxy to the Platform launch API

We cannot expose launching a tenant to an authorized user hence the need for the API

The API validates the x_amzn_marketplace_token and then proxies the request to the Platform Launch API

# paths./api/providers/aws/sync-domain-records/.get.description
API endpoint to get/update CNAME records for domain setup

# paths./api/providers/aws/sync-domain-records/.post.description
API endpoint to get/update CNAME records for domain setup

# paths./api/providers/gcp/create-organization/.post.description
Serves a view that redirects to the GCP marketplace create organization page

Set CREATE_ORGANIZATION_URL in GlobalConfigurationFetcher to the URL of the GCP marketplace create organization
page

# paths./api/providers/gcp/create-organization/{product_id}/.post.description
Serves a view that redirects to the GCP marketplace create organization page

Set CREATE_ORGANIZATION_URL in GlobalConfigurationFetcher to the URL of the GCP marketplace create organization
page

# paths./api/providers/gcp/launch-tenant/.post.description
Proxy to the Platform launch API

We cannot expose launching a tenant to an authorized user hence the need for the API

The API validates the x_gcp_marketplace_token and then proxies the request to the Platform Launc API

# paths./api/providers/google-pay/get-account/{bundle_id}.get.description
Google Allows us to pass an obfuscated account id to be sent to during a subscription purchase

# paths./api/providers/google-pay/validate-transaction-id/.post.description
Associate a Google Pay account with a known user

# paths./api/providers/stripe/create-organization/.post.description
Proxy to the Platform launch API

We cannot expose launching a tenant to an unauthorized user hence the need for the API

The API validates the stripe_checkout_id and then proxies the request to the Platform Launch API

# paths./api/recommendations/orgs/{org}/users/{user_id}/.get.description
API endpoint that returns a search api url prepopulated with context data
See http://localhost:8000/api/schema/swagger-ui/#/recommendations

# paths./api/reports/platforms/{key}/.get.description
Return the reports available on the platform along with the latest status for each report previously requested by the caller. When ``mentor_id`` is supplied, access validation is scoped to that mentor.

# paths./api/reports/platforms/{key}/.get.parameters[].description
Mentor primary key. When provided, access validation is scoped to that mentor.

# paths./api/reports/platforms/{key}/{report_name}.get.description
Returns details of a specific report type including its status if previously requested.

Required RBAC Permissions:
    1. CanViewAnalytics (kill switch):
       - Action: "Ibl.Analytics/CanViewAnalytics/action"
       - Resource: /platforms/{platform_pk}/

    2. Reports access to at least one user or usergroup:
       - Action: "Ibl.Analytics/Reports/read"
       - Resource: /platforms/{platform_pk}/users/{user_pk}/ OR
                   /platforms/{platform_pk}/usergroups/{group_pk}/
       - Note: User must have access to at least one user or usergroup resource
         with Reports/read permission. Unrestricted access to all users
         (/platforms/{platform_pk}/users/) also satisfies this requirement.

# paths./api/reports/platforms/{key}/{report_name}.get.parameters[].description
Mentor unique ID for mentor-specific reports (e.g., ai-mentor-chat-history). When provided, ownership is validated - mentor owners can access without explicit RBAC permissions.

# paths./api/reports/platforms/{key}/{task_id}/download.get.description
Download a completed report as CSV or JSON. Use the columns parameter to control column order.

# paths./api/reports/platforms/{key}/{task_id}/download.get.parameters[].description
Comma-separated column names to control output order. Must be a subset of the report's allowed_result_fields. Omit to use the report's default order.

# paths./api/reports/platforms/{key}/new.post.description
Triggers a new report generation.

If the report has been previously requested, it returns the status of the report.
Reports expire after a configured duration.

The request body should include:
- report_name: Name of the report to generate
- learner_id: (optional) ID of the learner to filter by
- course_id: (optional) ID of the course to filter by
- force: (optional) Force generation of a new report even if one exists
- filters: (optional) Additional filters for the report
- departments: (optional) Department IDs to filter by
- mentor: (optional) Mentor unique_id for mentor-specific reports (e.g., ai-mentor-chat-history)
- usergroup_ids: (optional) List of usergroup IDs to filter report data

Required RBAC Permissions:
    1. CanViewAnalytics (kill switch):
       - Action: "Ibl.Analytics/CanViewAnalytics/action"
       - Resource: /platforms/{platform_pk}/

    2. Reports access to at least one user or usergroup:
       - Action: "Ibl.Analytics/Reports/read"
       - Resource: /platforms/{platform_pk}/users/{user_pk}/ OR
                   /platforms/{platform_pk}/usergroups/{group_pk}/
       - Note: User must have access to at least one user or usergroup resource
         with Reports/read permission. Unrestricted access to all users
         (/platforms/{platform_pk}/users/) also satisfies this requirement.

    3. For mentor-specific reports (e.g., ai-mentor-chat-history):
       - Action: "Ibl.Analytics/Reports/read"
       - Resource: /platforms/{platform_pk}/mentors/{mentor_id}/
       - Note: User must have access to at least one mentor via RBAC OR own at least
         one mentor (created_by == username). If a specific mentor_unique_id is
         provided, user must have access to that specific mentor.
       - Raises PermissionDenied if user has no access to any mentors.

# paths./api/roles/platform/orgs/{org}/roles/users/{username}/desired-ro.get.description
Retrieve a user's desired role information.

This endpoint returns the role and skills that a user has indicated
they want to develop or acquire. This represents the user's career
goals and learning objectives.

Path Parameters:
    org (str): The platform/organization identifier
    username (str): The username of the user to retrieve role information for

Returns:
    The user's desired role information including:
    - Target role title
    - Skills needed for the role
    - Current progress toward skill acquisition

Error Responses:
    400 Bad Request: If the user doesn't exist in the platform or has no desired role
    404 Not Found: If the specified platform doesn't exist

# paths./api/roles/platform/orgs/{org}/roles/users/{username}/reported-r.get.description
Retrieve a user's reported role information.

This endpoint returns the role and skills that a user has reported
having in their profile. This represents the user's current skills
and professional role.

Path Parameters:
    org (str): The platform/organization identifier
    username (str): The username of the user to retrieve role information for

Returns:
    The user's reported role information including:
    - Role title
    - Skills associated with the role
    - Experience level

Error Responses:
    400 Bad Request: If the user doesn't exist in the platform or has no reported role
    404 Not Found: If the specified platform doesn't exist

# paths./api/search/ai-search/.get.description
Legacy endpoint for backward compatible mentor search

# paths./api/search/ai-search/.get.parameters[].description
If present, return only facets without results

# paths./api/search/ai-search/.get.parameters[].description
Field to sort results by ('created_at', 'recently_accessed_at')

# paths./api/search/ai-search/.get.parameters[].description
Page number (1-based, used with page_size)

# paths./api/search/ai-search/.get.parameters[].description
Search term to filter mentors by name or description

# paths./api/search/catalog/.get.description
Search and filter content across the learning catalog.

This endpoint provides a powerful search interface for discovering content across
multiple content types (courses, programs, pathways, skills, roles, resources).
It supports full-text search, faceted filtering, and pagination.

Query Parameters:
    query (str, optional): Search term to filter content by name or description
    content (list, optional): Content types to include in results
                             (courses, programs, pathways, skills, roles, resources)
                             Default: ["programs", "courses", "pathways", "skills"]

    # Filtering parameters
    course_id (str, optional): Filter by specific course ID
    program_id (str, optional): Filter by specific program ID
    pathway_id (str, optional): Filter by specific pathway ID
    skill_id (str, optional): Filter by specific skill ID
    subject (list, optional): Filter by subject areas
    tenant (list, optional): Filter by tenant/organization
    topics (list, optional): Filter by topic areas
    tags (list, optional): Filter by tags
    level (list, optional): Filter by difficulty level
    self_paced (list, optional): Filter by course format (self-paced, instructor-led)
    promotion (list, optional): Filter by promotion status
    language (list, optional): Filter by content language
    certificate (list, optional): Filter by certificate type
    program_type (list, optional): Filter by program type
    duration (list, optional): Filter by course duration range
    price (str, optional): Filter by price/audit status
    resource_type (list, optional): Filter by resource type
    skills (list, optional): Filter by skills

    # Sorting and pagination
    order_by (str, optional): Field to sort results by
    order_ascending (bool, optional): Sort direction (default: false)
    alphabetical (bool, optional): Sort alphabetically by name (default: false)
    limit (int, optional): Number of results per page (default: 12, max: 100)
    offset (int, optional): Starting position for pagination

    # Response options
    return_facet (bool, optional): Include facet data in response (default: true)
    return_items (bool, optional): Include items in programs/pathways (default: false)
    allow_skill_search (bool, optional): Enable skill-based search (default: false)
    update_facet (str, optional): Force facet update

Returns:
    A JSON response containing:
    - results: List of content items with metadata
    - count: Total number of matching items
    - next: URL for the next page of results (if available)
    - previous: URL for the previous page of results (if available)
    - current_page: Current page number
    - total_pages: Total number of pages
    - facets: Aggregated counts for each filter category (if requested)

Each content item contains type-specific fields:
    - Courses:
        {
            "id": 123,
            "type": "course",
            "course_id": "CS101",
            "name": "Introduction to Computer Science",
            "description": "Learn the fundamentals of computer science",
            "short_description": "CS fundamentals",
            "image_url": "https://example.com/images/cs101.jpg",
            "level": "Beginner",
            "subject": "Computer Science",
            "topics": ["Programming", "Algorithms"],
            "tags": ["python", "coding"],
            "language": "English",
            "tenant": "example-university",
            "self_paced": true,
            "duration": "6 weeks",
            "certificate": "Professional Certificate",
            "price": "Free",
            "skills": [
                {"id": 1, "name": "Python Programming"},
                {"id": 2, "name": "Algorithms"}
            ],
            "url": "https://example.com/courses/cs101"
        }

    - Programs:
        {
            "id": 456,
            "type": "program",
            "program_id": "PROG123",
            "name": "Data Science Program",
            "description": "Comprehensive data science curriculum",
            "short_description": "Learn data science",
            "image_url": "https://example.com/images/datascience.jpg",
            "level": "Intermediate",
            "subject": "Data Science",
            "topics": ["Machine Learning", "Statistics"],
            "program_type": "Professional Certificate",
            "courses": [
                {"id": 123, "name": "Introduction to Python"},
                {"id": 124, "name": "Statistics for Data Science"}
            ],
            "url": "https://example.com/programs/prog123"
        }

    - Pathways:
        {
            "id": 789,
            "type": "pathway",
            "pathway_id": "PATH456",
            "name": "Software Engineering Career Path",
            "description": "Complete pathway to become a software engineer",
            "image_url": "https://example.com/images/swe-path.jpg",
            "programs": [
                {"id": 456, "name": "Programming Fundamentals"},
                {"id": 457, "name": "Web Development"}
            ],
            "url": "https://example.com/pathways/path456"
        }

    - Skills:
        {
            "id": 321,
            "type": "skill",
            "name": "Machine Learning",
            "description": "Building systems that learn from data",
            "courses": [
                {"id": 125, "name": "Machine Learning Fundamentals"}
            ],
            "related_skills": [
                {"id": 322, "name": "Deep Learning"}
            ]
        }

    - Roles:
        {
            "id": 654,
            "type": "role",
            "name": "Data Scientist",
            "description": "Professional who analyzes and interprets complex data",
            "skills": [
                {"id": 321, "name": "Machine Learning"},
                {"id": 323, "name": "Data Analysis"}
            ],
            "recommended_courses": [
                {"id": 125, "name": "Machine Learning Fundamentals"}
            ]
        }

    - Resources:
        {
            "id": 987,
            "type": "resource",
            "name": "Python Cheat Sheet",
            "description": "Quick reference guide for Python",
            "resource_type": "PDF",
            "url": "https://example.com/resources/python-cheatsheet.pdf",
            "topics": ["Programming", "Python"]
        }

Error Responses:
    500 Internal Server Error: If an unexpected error occurs during processing

Notes:
    - Results are cached for performance
    - The 'resources' content type is only included by default if IBL_ENABLE_RESOURCES_IN_FACET is true
    - For debugging, add ?debug=true to see detailed information about skill matching

# paths./api/search/catalog/.get.parameters[].description
Search term to filter content by name or description

# paths./api/search/mentors/.get.description
Search and filter AI mentors across the platform.

This endpoint provides a powerful search interface for discovering AI mentors
with support for filtering, pagination, and detailed mentor information.

Query Parameters:
    # Identification parameters (for detail view)
    id (int, optional): Retrieve a specific mentor by ID
    unique_id (uuid, optional): Retrieve a specific mentor by UUID

    # Search and filtering parameters
    query (str, optional): Search term to filter mentors by name or description
    tenant (str, optional): Filter by tenant/organization
    llm (list, optional): Filter by language model type
    audience (list, optional): Filter by target audience
    category (list, optional): Filter by mentor category
    tags (list, optional): Filter by tags
    created_by (str, optional): Filter mentors created by specific user

    # Sorting and pagination
    order_by (str, optional): Field to sort results by ('created_at', 'recently_accessed_at')
    order_direction (str, optional): Sort direction ('asc' or 'desc', default: 'desc')
    limit (int, optional): Number of results per page (default: 12, max: 100)
    offset (int, optional): Starting position for pagination

Returns:
    For detail view (when id or unique_id is provided):
        A JSON response containing a single mentor's details:
        {
            "id": 123,
            "unique_id": "550e8400-e29b-41d4-a716-446655440000",
            "name": "Professor Smith",
            "description": "AI mentor specializing in computer science",
            "image_url": "https://example.com/images/prof-smith.jpg",
            "llm": {
                "id": 1,
                "name": "GPT-4",
                "description": "Advanced language model"
            },
            "audience": {
                "id": 2,
                "name": "College Students",
                "description": "For university-level learners"
            },
            "category": "Computer Science",
            "tags": ["programming", "algorithms", "data structures"],
            "created_at": "2023-01-15T12:00:00Z",
            "recently_accessed_at": "2023-06-20T15:30:00Z",
            "platform": {
                "id": 1,
                "name": "Example University",
                "key": "example-university"
            },
            "visibility": "public",
            "settings": {
                "temperature": 0.7,
                "max_tokens": 1024,
                "system_prompt": "You are Professor Smith, an expert in computer science..."
            }
        }

    For list view:
        A JSON response containing:
        {
            "results": [
                {
                    "id": 123,
                    "unique_id": "550e8400-e29b-41d4-a716-446655440000",
                    "name": "Professor Smith",
                    "description": "AI mentor specializing in computer science",
                    "image_url": "https://example.com/images/prof-smith.jpg",
                    "llm": {"id": 1, "name": "GPT-4"},
                    "audience": {"id": 2, "name": "College Students"},
                    "category": "Computer Science",
                    "tags": ["programming", "algorithms"],
                    "created_at": "2023-01-15T12:00:00Z",
                    "recently_accessed_at": "2023-06-20T15:30:00Z"
                },
                // Additional mentor objects...
            ],
            "count": 50,
            "next": "https://api.example.com/api/search/mentors/?limit=12&offset=12",
            "previous": null,
            "current_page": 1,
            "num_pages": 5,
            "facets": {
                "llm": [
                    {"key": "GPT-4", "doc_count": 30},
                    {"key": "Claude", "doc_count": 20}
                ],
                "audience": [
                    {"key": "College Students", "doc_count": 35},
                    {"key": "Professionals", "doc_count": 15}
                ],
                "category": [
                    {"key": "Computer Science", "doc_count": 25},
                    {"key": "Mathematics", "doc_count": 15},
                    {"key": "Business", "doc_count": 10}
                ]
            }
        }

Error Responses:
    400 Bad Request: If the request parameters are invalid
    404 Not Found: If the requested mentor doesn't exist
    500 Internal Server Error: If an unexpected error occurs

Notes:
    - Results are cached for performance
    - Public mentors are visible to all users
    - Private mentors are only visible to authorized users

# paths./api/search/mentors/.get.parameters[].description
Field to sort results by ('created_at', 'recently_accessed_at')

# paths./api/search/mentors/.get.parameters[].description
Search term to filter mentors by name or description

# paths./api/search/mentors/{mentor_unique_id}/documents/.get.description
Search and filter documents associated with a specific mentor

# paths./api/search/mentors/{mentor_unique_id}/documents/.get.parameters[].description
Filter by access level (e.g., 'public', 'private')

# paths./api/search/mentors/{mentor_unique_id}/documents/.get.parameters[].description
Filter by document type (e.g., 'pdf', 'text')

# paths./api/search/mentors/{mentor_unique_id}/documents/.get.parameters[].description
Field to sort results by ('date_created', 'last_modified', 'document_name')

# paths./api/search/mentors/{mentor_unique_id}/documents/.get.parameters[].description
Search term to filter documents by name or content

# paths./api/search/mentors/{mentor_unique_id}/documents/.get.parameters[].description
Filter by training status (e.g., 'trained', 'pending')

# paths./api/search/orgs/{org}/users/{username}/mentors/.get.description
Handle GET requests for tenant-specific mentor search.

Args:
    request: HTTP request object
    org: Tenant/organization key
    username: Username of the user making the request

Returns:
    Response: DRF Response object with search results

# paths./api/search/orgs/{org}/users/{username}/mentors/.get.parameters[].description
Field to sort results by ('created_at', 'recently_accessed_at')

# paths./api/search/orgs/{org}/users/{username}/mentors/.get.parameters[].description
Search term to filter mentors by name or description

# paths./api/search/orgs/{org}/users/{username}/prompts/.get.description
Search and filter AI prompts for a specific user within a tenant.

This endpoint extends the base prompt search functionality but filters results
to only show prompts that are available to a specific user within a specific
organization/tenant.

Path Parameters:
    org (str): The organization/tenant identifier
    username (str): The username to filter prompts for

Query Parameters:
    Same as PromptSearchView, plus:

    # Identification parameters (for detail view)
    id (int, optional): Retrieve a specific prompt by ID

Returns:
    Same format as PromptSearchView, but filtered to only include prompts
    that the specified user has access to within the specified organization.

Error Responses:
    400 Bad Request: If the request parameters are invalid
    403 Forbidden: If the requested prompt exists but the user doesn't have access
    404 Not Found: If the requested prompt doesn't exist
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - Results are filtered based on user's permissions within the organization
    - Private prompts are only visible to authorized users

# paths./api/search/orgs/{org}/users/{username}/prompts/.get.parameters[].description
If true, return only facets without results

# paths./api/search/orgs/{org}/users/{username}/prompts/.get.parameters[].description
Search term to filter prompts by name or content

# paths./api/search/orgs/{org}/users/{username}/recommended/.get.description
Determine whether to serve a detail view or a list view.

# paths./api/search/orgs/{org}/users/{username}/recommended/.get.parameters[].description
Content types to include in recommendations (courses, programs, pathways, skills, roles, resources)

# paths./api/search/orgs/{org}/users/{username}/recommended/.get.parameters[].description
Search term to filter content by name or description

# paths./api/search/orgs/{org}/users/{username}/recommended/.get.parameters[].description
Filter by course format (self-paced, instructor-led)

# paths./api/search/personalized-catalog/{username}/.get.description
Determine whether to serve a detail view or a list view.
If any detail-identifying parameters are present (course_id, program_id, etc.)
the detail view is returned; otherwise the aggregated list view is returned.

# paths./api/search/personalized-catalog/{username}/.get.parameters[].description
Search term to filter content by name or description

# paths./api/search/prompts/.get.description
Search and filter AI prompts across the platform.

This endpoint provides a search interface for discovering AI prompts
with support for filtering, pagination, and detailed prompt information.

Query Parameters:
    # Identification parameters (for detail view)
    id (int, optional): Retrieve a specific prompt by ID

    # Search and filtering parameters
    query (str, optional): Search term to filter prompts by name or content
    category (str, optional): Filter by prompt category
    language (str, optional): Filter by prompt language
    style (str, optional): Filter by writing style
    tone (str, optional): Filter by tone
    tenant (str, optional): Filter by tenant/organization
    mentor (str, optional): Filter by associated mentor (UUID)

    # Sorting and pagination
    sort_by (str, optional): Field to sort results by
    order_direction (str, optional): Sort direction ('asc' or 'desc', default: 'desc')
    alphabetical (bool, optional): Sort alphabetically by name (default: false)
    limit (int, optional): Number of results per page (default: 10)
    offset (int, optional): Starting position for pagination

    # Special parameters
    filter_facet (any, optional): If present, return only facets without results

Returns:
    For detail view (when id is provided):
        A JSON response containing a single prompt's details:
        {
            "id": 456,
            "name": "Essay Writing Guide",
            "content": "Write a well-structured essay on the following topic: {{topic}}...",
            "category": "Academic Writing",
            "language": "English",
            "style": "Formal",
            "tone": "Professional",
            "mentor": {
                "id": 123,
                "unique_id": "550e8400-e29b-41d4-a716-446655440000",
                "name": "Professor Smith"
            },
            "platform": {
                "id": 1,
                "name": "Example University",
                "key": "example-university"
            },
            "created_at": "2023-02-10T09:15:00Z",
            "updated_at": "2023-05-05T14:20:00Z",
            "visibility": "public",
            "variables": ["topic", "length", "style"]
        }

    For list view:
        A JSON response containing:
        {
            "results": [
                {
                    "id": 456,
                    "name": "Essay Writing Guide",
                    "content": "Write a well-structured essay on the following topic: {{topic}}...",
                    "category": "Academic Writing",
                    "language": "English",
                    "style": "Formal",
                    "tone": "Professional",
                    "mentor": {"id": 123, "name": "Professor Smith"},
                    "created_at": "2023-02-10T09:15:00Z",
                    "updated_at": "2023-05-05T14:20:00Z"
                },
                // Additional prompt objects...
            ],
            "count": 30,
            "next": "?limit=10&offset=10",
            "previous": null,
            "current_page": 1,
            "num_pages": 3,
            "facets": {
                "category": [
                    {"key": "Academic Writing", "doc_count": 15},
                    {"key": "Creative Writing", "doc_count": 10},
                    {"key": "Technical Documentation", "doc_count": 5}
                ],
                "language": [
                    {"key": "English", "doc_count": 25},
                    {"key": "Spanish", "doc_count": 5}
                ],
                "style": [
                    {"key": "Formal", "doc_count": 20},
                    {"key": "Casual", "doc_count": 10}
                ],
                "tone": [
                    {"key": "Professional", "doc_count": 15},
                    {"key": "Friendly", "doc_count": 10},
                    {"key": "Technical", "doc_count": 5}
                ]
            }
        }

Error Responses:
    400 Bad Request: If the request parameters are invalid
    403 Forbidden: If the requested prompt exists but is not publicly available
    404 Not Found: If the requested prompt doesn't exist
    500 Internal Server Error: If an unexpected error occurs

Notes:
    - Only publicly available prompts are returned by default
    - When filtering by mentor, the mentor ID must be a valid UUID

# paths./api/search/prompts/.get.parameters[].description
If true, return only facets without results

# paths./api/search/prompts/.get.parameters[].description
Search term to filter prompts by name or content

# paths./api/search/users/orgs/{org}/users/{username}/.get.description
Search and filter users within a specific organization/tenant.

This endpoint provides a search interface for discovering users within an organization,
with support for filtering by departments, pagination, and faceted filtering.

Path Parameters:
    org (str): The organization/tenant identifier
    username (str): The username of the user making the request

Query Parameters:
    # Search parameters
    query (str, optional): Search term to filter users by name, username, or email

    # Department filtering
    department_mode (bool, optional): Enable department-based filtering (default: false)
    user_department (bool, optional): Legacy parameter for department_mode (default: false)
    department (list, optional): Filter by specific departments

    # Additional filters
    role (list, optional): Filter by user role
    status (list, optional): Filter by user status (active, inactive)
    joined_date (list, optional): Filter by join date range
    last_login (list, optional): Filter by last login date range

    # Pagination
    limit (int, optional): Number of results per page (default: 10)
    offset (int, optional): Starting position for pagination

Returns:
    A JSON response containing:
    ```
    {
        "results": [
            {
                "id": 123,
                "username": "john.doe",
                "email": "john.doe@example.com",
                "first_name": "John",
                "last_name": "Doe",
                "full_name": "John Doe",
                "profile_image": "https://example.com/profiles/john-doe.jpg",
                "role": "Student",
                "departments": ["Computer Science", "Data Science"],
                "status": "active",
                "joined_date": "2023-01-15T12:00:00Z",
                "last_login": "2023-06-20T15:30:00Z",
                "metadata": {
                    "location": "New York",
                    "title": "Software Engineer",
                    "bio": "Experienced software engineer with a passion for education"
                }
            },
            // Additional user objects...
        ],
        "count": 50,
        "next": "https://api.example.com/api/search/users/example-org/admin/?limit=10&offset=10",
        "previous": null,
        "current_page": 1,
        "total_pages": 5,
        "facets": {
            "role": [
                {"key": "Student", "doc_count": 30},
                {"key": "Instructor", "doc_count": 15},
                {"key": "Admin", "doc_count": 5}
            ],
            "department": [
                {"key": "Computer Science", "doc_count": 20},
                {"key": "Data Science", "doc_count": 15},
                {"key": "Business", "doc_count": 10},
                {"key": "Engineering", "doc_count": 5}
            ],
            "status": [
                {"key": "active", "doc_count": 45},
                {"key": "inactive", "doc_count": 5}
            ]
        }
    }
    ```
Error Responses:
    400 Bad Request: If the request parameters are invalid
    403 Forbidden: If the user doesn't have department admin privileges (when using department_mode)
    404 Not Found: If the user or organization doesn't exist
    500 Internal Server Error: If an unexpected error occurs

Access Control:
    - The requesting user must have an active account in the specified organization
    - When department_mode is enabled, the user must be an admin of at least one department
    - Department filtering restricts results to users in departments where the requesting user is an admin

# paths./api/search/users/orgs/{org}/users/{username}/.get.parameters[].description
Include user group membership data in results

# paths./api/search/users/orgs/{org}/users/{username}/.get.parameters[].description
Search term to filter users by name, email, or other attributes

# paths./api/service/launch/tenant/.post.description
User/tenant creation API

To create using any payment provider, ensure you use the StudentToken Authentication Mechanism
 and also include the correct `provider_key` in the request body:

```
    apple_transaction_id: str
    stripe_checkout_id: str
    x_gcp_marketplace_token: str
    aws_transaction_id: str
    google_pay_transaction_id: str
```

To create a tenant without a payment provider, call the API without ny of the above provider keys in the request body

# paths./api/service/orgs/{org}/users/{user_id}/stripe/checkout-session/.post.description
Stripe checkout session API View for user upgrade

Request the following fields:

- tenant
- sku
- mode
- success_url
- cancel_url

Response:
{
    "redirect_to": "https://checkout.stripe.com/xxx/xxxx/xxxx",
}

# paths./api/service/orgs/{org}/users/{user_id}/stripe/products/manage/.post.description
Mixin that includes the StudentTokenAuthentication and IsPlatformAdmin

# paths./api/service/orgs/{platform_key}/stripe/course-payment-callback/.get.description
Handle course payment callback after successful Stripe checkout.
Enrolls the user in the purchased course.

URL Parameters:
    - stripe_checkout_id: The local Checkout Session UUID

Response:
    - Redirect: Successfully processed course enrollment
    - 404: Checkout session not found
    - 400: Invalid checkout session or product
    - 500: Server error during processing

# paths./api/service/platforms/{platform_key}/stripe/connect/onboard/.post.description
Start Stripe Connect onboarding for platform admin

# paths./api/service/platforms/{platform_key}/stripe/connect/onboard/ref.post.description
Start Stripe Connect onboarding for platform admin

# paths./api/service/platforms/{platform_key}/stripe/context/.get.description
Create a uuid to help us track internally user initiated checkout

# paths./api/service/platforms/{platform_key}/stripe/credit-topup-callba.get.description
Unified callback after successful Stripe checkout.

Handles both subscription (pricing page) and credit-topup (payment mode)
checkouts. The checkout type is determined from the Stripe session automatically.

URL Parameters:
    - checkout_session_id: The Stripe Checkout Session ID (optional in URL,
      can also be passed as ?stripe_checkout_id query param)

Response:
    - Redirect: Successfully validated and sending to next page
    - 404: Checkout session not found
    - 400: Invalid checkout session or product

# paths./api/service/platforms/{platform_key}/stripe/pricing-page-callba.get.description
Unified callback after successful Stripe checkout.

Handles both subscription (pricing page) and credit-topup (payment mode)
checkouts. The checkout type is determined from the Stripe session automatically.

URL Parameters:
    - checkout_session_id: The Stripe Checkout Session ID (optional in URL,
      can also be passed as ?stripe_checkout_id query param)

Response:
    - Redirect: Successfully validated and sending to next page
    - 404: Checkout session not found
    - 400: Invalid checkout session or product

# paths./api/service/platforms/{platform_key}/stripe/pricing-page-callba.get.description
Unified callback after successful Stripe checkout.

Handles both subscription (pricing page) and credit-topup (payment mode)
checkouts. The checkout type is determined from the Stripe session automatically.

URL Parameters:
    - checkout_session_id: The Stripe Checkout Session ID (optional in URL,
      can also be passed as ?stripe_checkout_id query param)

Response:
    - Redirect: Successfully validated and sending to next page
    - 404: Checkout session not found
    - 400: Invalid checkout session or product

# paths./api/service/platforms/{platform_key}/stripe/pricing-page-sessio.get.description
Create a uuid to track user-initiated pricing page checkouts.

Works for both authenticated and unauthenticated (guest) users.
Accepts optional `redirect_url` and `source_platform_key` query params.

# paths./api/service/stripe/checkout/free-trial/.post.description
Stripe free trial checkout session. No user auth

Request the following fields:

- success_url
- cancel_url
- product

Response:
{
    "redirect_to": "https://checkout.stripe.com/xxx/xxxx/xxxx",
}

# paths./api/service/stripe/checkout/redirect/{sku}/.get.description
Public GET endpoint that creates a Stripe checkout session and redirects to Stripe.
After checkout, routes through pricing-page-callback for tenant provisioning.

URL: /api/service/stripe/checkout/redirect/<sku>/
Query params:
  - redirect_url (optional): Final destination after successful checkout + provisioning.
        When omitted, the pricing-page-callback uses its default redirect.
  - cancel_url (optional): Where to redirect if checkout is cancelled.
        Defaults to the mentor AI portal.

# paths./api/service/stripe/new-user-checkout/.post.description
Stripe checkout session API View for new users (first-time subscription)

Request the following fields:

- user_id, username, or email (user identifier)
- tenant (tenant type to create after successful checkout)
- sku
- mode (choices: "subscription", "payment", "setup")
- success_url
- cancel_url
- period (optional): Billing period - "weekly", "monthly", or "yearly" (defaults to "monthly")
- skip_card (optional): Skip card collection for free plans
- is_free_trial (optional): Enable free trial mode

Response:
{
    "redirect_to": "https://checkout.stripe.com/xxx/xxxx/xxxx",
}

# paths./api/service/tenant/validation/.post.description
Check if a tenant with a given key, org, or name exists.

At least one non-empty filter parameter (key, org, or name) is required.

# paths./api/service/token/.get.description
GET
Gets site hash_key from
or
Gets site_id form hash_key

# paths./api/skills/orgs/{org}/skills.get.description
List all available skills on the platform.

This endpoint returns information about all skills that can be
acquired on the platform.

Path Parameters:
    org (str): The platform/organization identifier

Returns:
    A list of all skills with basic information about each skill.

Access Control:
    - Platform admins can access this information
    - All authenticated users can access this information

# paths./api/skills/orgs/{org}/skills/{skill_id}/percentile/.get.description
Retrieve percentile distribution for a specific skill.

This endpoint returns the percentile distribution of points earned
by users for a specific skill.

Path Parameters:
    skill_id (int): The ID of the skill to retrieve percentile information for
    org (str, optional): The platform/organization identifier to filter results

Returns:
    A list of percentile breakpoints for the specified skill.

Error Responses:
    404 Not Found: If the specified skill doesn't exist

Access Control:
    - Platform admins can access this information
    - All authenticated users can access this information

# paths./api/skills/orgs/{org}/skills/{skill_name}/.get.description
Retrieve detailed information about a specific skill.

This endpoint returns comprehensive information about a specific skill,
including its description, categories, and related courses.

Path Parameters:
    org (str): The platform/organization identifier
    skill_name (str): The name of the skill to retrieve details for

Returns:
    Detailed information about the specified skill.

Error Responses:
    404 Not Found: If the specified skill doesn't exist

Access Control:
    - Platform admins can access this information
    - All authenticated users can access this information

# paths./api/skills/orgs/{org}/skills/thresholds/.get.description
Manage skill thresholds for a platform.

This endpoint allows platform administrators to view, create, update, and delete
skill thresholds. Skill thresholds define the minimum points required to consider
a skill as acquired or mastered.

Path Parameters:
    org (str): The platform/organization identifier

Methods:
    GET: Retrieve all skill thresholds for the platform
    POST: Create a new skill threshold
    PATCH: Update an existing skill threshold
    DELETE: Delete all skill thresholds for the platform

Request Body (POST):
    name (str, required): The name of the threshold level (e.g., "Beginner", "Intermediate")
    threshold (int, required): The minimum points required to reach this threshold

Request Body (PATCH):
    name (str, required): The name of the existing threshold to update
    threshold (int, required): The new minimum points value for this threshold

Returns:
    GET: A list of all skill thresholds for the platform
    POST/PATCH: The created or updated skill threshold with format:
        {
            "name": "threshold_name",
            "threshold": threshold_value
        }
    DELETE: No content (204)

Error Responses:
    400 Bad Request: If the request data is invalid or missing required fields
    404 Not Found: If the specified platform doesn't exist or the threshold
                  to update cannot be found

Access Control:
    - Only platform administrators can access this endpoint

# paths./api/skills/orgs/{org}/skills/thresholds/.post.description
Manage skill thresholds for a platform.

This endpoint allows platform administrators to view, create, update, and delete
skill thresholds. Skill thresholds define the minimum points required to consider
a skill as acquired or mastered.

Path Parameters:
    org (str): The platform/organization identifier

Methods:
    GET: Retrieve all skill thresholds for the platform
    POST: Create a new skill threshold
    PATCH: Update an existing skill threshold
    DELETE: Delete all skill thresholds for the platform

Request Body (POST):
    name (str, required): The name of the threshold level (e.g., "Beginner", "Intermediate")
    threshold (int, required): The minimum points required to reach this threshold

Request Body (PATCH):
    name (str, required): The name of the existing threshold to update
    threshold (int, required): The new minimum points value for this threshold

Returns:
    GET: A list of all skill thresholds for the platform
    POST/PATCH: The created or updated skill threshold with format:
        {
            "name": "threshold_name",
            "threshold": threshold_value
        }
    DELETE: No content (204)

Error Responses:
    400 Bad Request: If the request data is invalid or missing required fields
    404 Not Found: If the specified platform doesn't exist or the threshold
                  to update cannot be found

Access Control:
    - Only platform administrators can access this endpoint

# paths./api/skills/orgs/{org}/skills/thresholds/.patch.description
Manage skill thresholds for a platform.

This endpoint allows platform administrators to view, create, update, and delete
skill thresholds. Skill thresholds define the minimum points required to consider
a skill as acquired or mastered.

Path Parameters:
    org (str): The platform/organization identifier

Methods:
    GET: Retrieve all skill thresholds for the platform
    POST: Create a new skill threshold
    PATCH: Update an existing skill threshold
    DELETE: Delete all skill thresholds for the platform

Request Body (POST):
    name (str, required): The name of the threshold level (e.g., "Beginner", "Intermediate")
    threshold (int, required): The minimum points required to reach this threshold

Request Body (PATCH):
    name (str, required): The name of the existing threshold to update
    threshold (int, required): The new minimum points value for this threshold

Returns:
    GET: A list of all skill thresholds for the platform
    POST/PATCH: The created or updated skill threshold with format:
        {
            "name": "threshold_name",
            "threshold": threshold_value
        }
    DELETE: No content (204)

Error Responses:
    400 Bad Request: If the request data is invalid or missing required fields
    404 Not Found: If the specified platform doesn't exist or the threshold
                  to update cannot be found

Access Control:
    - Only platform administrators can access this endpoint

# paths./api/skills/orgs/{org}/skills/thresholds/.delete.description
Manage skill thresholds for a platform.

This endpoint allows platform administrators to view, create, update, and delete
skill thresholds. Skill thresholds define the minimum points required to consider
a skill as acquired or mastered.

Path Parameters:
    org (str): The platform/organization identifier

Methods:
    GET: Retrieve all skill thresholds for the platform
    POST: Create a new skill threshold
    PATCH: Update an existing skill threshold
    DELETE: Delete all skill thresholds for the platform

Request Body (POST):
    name (str, required): The name of the threshold level (e.g., "Beginner", "Intermediate")
    threshold (int, required): The minimum points required to reach this threshold

Request Body (PATCH):
    name (str, required): The name of the existing threshold to update
    threshold (int, required): The new minimum points value for this threshold

Returns:
    GET: A list of all skill thresholds for the platform
    POST/PATCH: The created or updated skill threshold with format:
        {
            "name": "threshold_name",
            "threshold": threshold_value
        }
    DELETE: No content (204)

Error Responses:
    400 Bad Request: If the request data is invalid or missing required fields
    404 Not Found: If the specified platform doesn't exist or the threshold
                  to update cannot be found

Access Control:
    - Only platform administrators can access this endpoint

# paths./api/skills/orgs/{org}/skills/users/{user_id}/.get.description
Retrieve a user's skill information.

This endpoint returns information about skills that a user has acquired
through the platform. It can return all skills or filter by a specific skill.

Path Parameters:
    org (str): The platform/organization identifier
    user_id (str): The username of the user to retrieve skill information for

Query Parameters:
    skill_name (str, optional): Filter results to a specific skill

Returns:
    When skill_name is provided:
        Details about the specific skill including points earned and percentile ranking

    When skill_name is not provided:
        A list of all skills the user has acquired with their points

Access Control:
    - Platform admins can access any user's skill information
    - Users can access their own skill information

# paths./api/skills/orgs/{org}/skills/users/{user_id}/desired-skills/.get.description
Retrieve a user's desired skills.

This endpoint returns the skills that a user has indicated they want
to develop or acquire through the platform.

Path Parameters:
    org (str): The platform/organization identifier
    user_id (str): The username of the user to retrieve skill information for

Returns:
    The user's desired skills information.

Error Responses:
    400 Bad Request: If the user doesn't exist in the platform or has no desired skills
    404 Not Found: If the specified platform doesn't exist

Access Control:
    - Platform admins can access any user's information
    - Users can access their own information

# paths./api/skills/orgs/{org}/skills/users/{user_id}/point-percentile/.get.description
Retrieve a user's total skill points and percentile ranking.

This endpoint returns the total skill points a user has earned across
all skills and their percentile ranking compared to other users on the platform.

Path Parameters:
    org (str): The platform/organization identifier
    user_id (str): The username of the user to retrieve information for

Returns:
    The user's total skill points and percentile ranking information:
    - Username
    - Total points earned across all skills
    - Percentile ranking compared to other users

Access Control:
    - Platform admins can access any user's information
    - Users can access their own information

# paths./api/skills/orgs/{org}/skills/users/{user_id}/reported-skills/.get.description
Retrieve a user's self-reported skills.

This endpoint returns the skills that a user has reported having
prior to or outside of the platform learning experience.

Path Parameters:
    org (str): The platform/organization identifier
    user_id (str): The username of the user to retrieve skill information for

Returns:
    The user's self-reported skills information. When the user is not
    linked to the platform or has no reported skills, an empty
    ``{"skills": []}`` payload is returned with a 200 status so callers
    can distinguish "no data" from a request error.

Error Responses:
    404 Not Found: If the specified platform doesn't exist

Access Control:
    - Platform admins can access any user's information
    - Users can access their own information

# paths./api/user-groups/orgs/{key}/.get.description
Get a list of user groups with metrics and filtering options.

This endpoint provides a paginated list of user groups with aggregated metrics
about learner performance, course completions, and skill acquisition.

This endpoint uses DM token authentication and respects department-based
access controls.

Query Parameters:
    page (int, optional): Page number for pagination
    length (int, optional): Number of items per page
    program (str, optional): Filter by program
    pathway (str, optional): Filter by pathway
    groups (list, optional): Filter by group names
    location (str, optional): Filter by location
    is_enrolled (bool, optional): Filter for groups with enrolled users
    start_date (date, optional): Filter by learner join date (start range)
    end_date (date, optional): Filter by learner join date (end range)

Returns:
    A paginated list of user groups with comprehensive metrics.

Access Control:
    - Platform admins can see all groups
    - Department admins can only see groups in their departments

# paths./api/user-groups/orgs/{key}/.get.parameters[].description
When `department_mode=1` is passed, it allows to filter data for only user content groups for the specified department 

# paths./api/user-groups/orgs/{key}/.get.parameters[].description
Filter by learners date_joined. Start date. ISO 8601

# paths./api/user-groups/orgs/{key}/.get.parameters[].description
Groups search string. Single string or list of strings. e.g 'sample_group' or `['group', 'another group']` 

# paths./api/user-groups/orgs/{key}/.get.parameters[].description
Filter for users who have at least an enrollment

# paths./api/user-groups/orgs/{key}/.get.parameters[].description
Filter by learners date_joined. Start date. ISO 8601

# components.schemas.AWSTenantLaunchRequest.properties.is_advertising.description
Advertising mode allows a platform to set custom usd balance to allocate for its members

# components.schemas.AWSTenantLaunchRequest.properties.aws_transaction_id.description
AWS Marketplace Customer Id and Product Code Identifier

# components.schemas.AcceptanceEnum.description
* `Unaccepted` - Unaccepted
* `Accepted` - Accepted
* `Rejected` - Rejected

# components.schemas.AccessEnum.description
* `public` - Public
* `private` - Private

# components.schemas.AccessibleMentorsByEmailRequest.description
Request serializer for accessible mentors by email endpoint.

# components.schemas.AccessibleMentorsByEmailRequest.properties.email.description
The user email to check mentor access for

# components.schemas.AccessibleMentorsByEmailRequest.properties.all_mentors.description
If true, return all mentors in the platform (ignoring email if present). If false (default), return only mentors owned by the user's email.

# components.schemas.AccessibleMentorsByEmailResponse.description
Response serializer for accessible mentors by email.

# components.schemas.AccessibleMentorsByEmailResponse.properties.user_id.description
The user ID that mentors belong to when all_mentors is False

# components.schemas.ActiveUsersPerCourse.properties.total.description
Total unique active users in this period

# components.schemas.Activity.properties.platform.description
Platform this Activity belongs to. Set automatically from your credentials; you cannot pass another Platform's id.

# components.schemas.Activity.properties.title.description
Short summary (e.g. 'Discovery call', 'Stage changed').

# components.schemas.Activity.properties.type.description
Interaction kind. One of `call`, `meeting`, `email`, `note`, `task`, `lunch`, `deadline`.

* `call` - Call
* `meeting` - Meeting
* `email` - Email
* `note` - Note
* `task` - Task
* `lunch` - Lunch
* `deadline` - Deadline

# components.schemas.Activity.properties.location.description
Meeting location / call dial-in / venue.

# components.schemas.Activity.properties.schedule_from.description
Scheduled start. Leave null for instant log entries.

# components.schemas.Activity.properties.is_done.description
Mark the Activity complete. Use `POST /activities/{id}/done/` to flip this and automatically stamp `done_at`.

# components.schemas.Activity.properties.done_at.description
Read-only. Set automatically the first time `is_done` flips True.

# components.schemas.Activity.properties.deal.description
Id of the Deal this Activity is logged against. Either `deal` or `person` is required.

# components.schemas.Activity.properties.person.description
UUID of the Person this Activity is logged against. Either `deal` or `person` is required.

# components.schemas.Activity.properties.owner.description
Id of the user who scheduled / logged this Activity. Defaults to the calling user on create.

# components.schemas.Activity.properties.reminder_sent.description
Marks that a reminder has been sent for this Activity; prevents the same reminder from firing twice.

# components.schemas.Activity.properties.metadata.description
Free-form JSON for Platform-defined attributes.

# components.schemas.ActivityData.properties.average_time_invested.description
Overall course average time invested (other students inclusive)

# components.schemas.ActivityData.properties.days_away.description
Days from today the course has been accessed

# components.schemas.ActivityTypeEnum.description
* `call` - Call
* `meeting` - Meeting
* `email` - Email
* `note` - Note
* `task` - Task
* `lunch` - Lunch
* `deadline` - Deadline

# components.schemas.AddMentorToDisclaimer.description
Serializer for adding a mentor to a disclaimer.

This serializer validates the mentor_id input and provides proper schema documentation
for the add_mentor action.

# components.schemas.AddMentorToDisclaimer.properties.mentor_id.description
The unique_id of the mentor to add to the disclaimer.

# components.schemas.AdminIntegrationCredential.description
For admins - returns .masked_value (all fields, sensitive ones masked).
Admins see that credentials are configured without seeing actual secrets.

Inherits from StudentIntegrationCredentialSerializer, only overrides get_value.

# components.schemas.AgentSkill.properties.category.description
Grouping for the catalog UI: web, code, browser, data, etc.

# components.schemas.AgentSkill.properties.is_featured.description
Featured skills on the 'main' platform are visible to all tenants.

# components.schemas.AgentSkill.properties.instruction.description
SKILL.md body — the agent runbook for this skill.

# components.schemas.AgentSkill.properties.metadata.description
SKILL.md frontmatter (requires, primaryEnv, emoji, etc.).

# components.schemas.AgentSkillResource.properties.content.description
Text content for script/reference resources.

# components.schemas.Answer.description
Serializer for an individual answer choice for a question.

Attributes:
    text (str): The text of the answer.
    is_correct (Optional[bool]): Boolean indicating if this answer is correct.

# components.schemas.App.properties.onboarding_required.description
If true, users will be required to complete onboarding before using this app

# components.schemas.Artifact.description
Serializer for Artifact model.

Artifacts are structured content like essays, documents, code files, etc.
that are generated by AI agents during a chat session and are best
displayed separately from the normal chat flow.

Fields:
    - id: Unique identifier for the artifact
    - title: Title or identifier for the artifact
    - content: The markdown-styled content of the artifact
    - file_extension: The extension of the file (e.g., 'py', 'md', 'html', 'json', 'csv')
    - chat_message: Reference to the chat message that contains this artifact
    - llm_name: Name of the LLM that generated the artifact
    - llm_provider: Provider of the LLM (e.g., 'openai', 'google', 'anthropic')
    - date_created: Timestamp when the artifact was created
    - date_updated: Timestamp when the artifact was last updated
    - metadata: Additional metadata for the artifact
    - username: Username of the student who owns the artifact (read-only)
    - session_id: UUID of the session that generated the artifact (read-only)

Read-only fields:
    - id, date_created, date_updated, username, session_id

# components.schemas.Artifact.properties.file_extension.description
The extension of the file for the artifact. eg. `py`, `md`, `html`, `json`, `csv`, etc

# components.schemas.Artifact.properties.username.description
Username of the student who owns this artifact

# components.schemas.Artifact.properties.version_count.description
Total number of versions for this artifact

# components.schemas.ArtifactList.description
Lightweight serializer for listing artifacts.

This serializer is optimized for list views, excluding the potentially
large content field and including useful computed fields.

Fields:
    - id: Unique identifier for the artifact
    - title: Title or identifier for the artifact
    - file_extension: The extension of the file
    - llm_name: Name of the LLM that generated the artifact
    - llm_provider: Provider of the LLM
    - date_created: Timestamp when the artifact was created
    - date_updated: Timestamp when the artifact was last updated
    - username: Username of the student who owns the artifact
    - session_id: UUID of the session that generated the artifact
    - content_length: Length of the content in characters

# components.schemas.ArtifactList.properties.file_extension.description
The extension of the file for the artifact. eg. `py`, `md`, `html`, `json`, `csv`, etc

# components.schemas.ArtifactList.properties.username.description
Username of the student who owns this artifact

# components.schemas.ArtifactList.properties.content_length.description
Length of the artifact content in characters

# components.schemas.ArtifactVersion.description
Serializer for ArtifactVersion model.

Represents a single version of an artifact with its content and metadata.

# components.schemas.ArtifactVersion.properties.content.description
The markdown-styled content of this artifact version

# components.schemas.ArtifactVersion.properties.session_id.description
UUID of the session that generated this artifact version

# components.schemas.ArtifactVersion.properties.content_length.description
Length of the version content in characters

# components.schemas.ArtifactVersion.properties.is_current.description
Whether this version is the current/active version

# components.schemas.ArtifactVersion.properties.version_number.description
Sequential version number for display purposes

# components.schemas.ArtifactVersion.properties.created_by.description
Identifier for who created this version (e.g., 'llm', 'user:username')

# components.schemas.ArtifactVersion.properties.change_summary.description
Optional summary of what changed in this version

# components.schemas.ArtifactVersion.properties.interface.description
How this version was created

* `chat` - Chat
* `api` - Api

# components.schemas.AuthModeEnum.description
* `bearer_token` - Bearer token
* `header` - Header
* `query_param` - Query param
* `none` - None

# components.schemas.AuthScopeEnum.description
* `platform` - Platform
* `mentor` - Mentor
* `user` - User

# components.schemas.AuthTypeEnum.description
* `none` - None
* `token` - Token
* `oauth2` - Oauth2

# components.schemas.AutoRechargeTriggerRequest.description
Request schema for POST auto-recharge/trigger/.

# components.schemas.AutoRechargeTriggerRequest.properties.platform_key.description
The unique key of the platform. Defaults to 'main'.

# components.schemas.AutoRechargeTriggerRequest.properties.amount_usd.description
Optional. When set, perform manual top-up: charge this amount (user USD) and add credits. No threshold, spending limit, or cooldown. Omit to run normal auto-recharge once.

# components.schemas.AutoRechargeTriggerResponse.description
Response schema for POST auto-recharge/trigger/ (200).

# components.schemas.AutoRechargeTriggerResponse.properties.status.description
'triggered' if a charge was attempted, 'skipped' otherwise.

* `triggered` - triggered
* `skipped` - skipped

# components.schemas.AutoRechargeTriggerResponseStatusEnum.description
* `triggered` - triggered
* `skipped` - skipped

# components.schemas.AvailableNotificationType.description
Serializer for available notification types with user preferences.

# components.schemas.AvailableNotificationType.properties.is_enabled.description
Whether this type is enabled for the platform

# components.schemas.AvailableNotificationType.properties.user_preference.description
User's per-type preference (enabled, frequency)

# components.schemas.AverageOvertime.properties.data.description
Dates are keys and values are the value for the date in the key. e,g `{"2020-01-01": 30. ...}`

# components.schemas.BaseFinanceResponse.properties.percentage_change.description
Percentage change vs comparison period (null if no comparison)

# components.schemas.BaseFinanceResponse.properties.overtime.description
Time series data for overtime visualization

# components.schemas.BaseFinanceResponse.properties.comparison_info.description
Information about comparison period (empty if no comparison)

# components.schemas.BlankCourseInvitationCreate.properties.source.description
The source identifier for the invitations

# components.schemas.BlankCourseInvitationCreate.properties.count.description
The number of blank invitations to create

# components.schemas.BlankPlatformInvitationCreate.properties.source.description
The source identifier for the invitations

# components.schemas.BlankPlatformInvitationCreate.properties.count.description
The number of blank invitations to create

# components.schemas.BlankProgramInvitationCreate.properties.source.description
The source identifier for the invitations

# components.schemas.BlankProgramInvitationCreate.properties.count.description
The number of blank invitations to create

# components.schemas.BlockSkillPointInfoRequest.description
Request serializer for BlockSkillPointInfoView POST endpoint.
Validates request body for updating block skill point information.

# components.schemas.BlockSkillPointInfoRequest.properties.block_id.description
ID of the block to update skill point information for

# components.schemas.BlockSkillPointInfoRequest.properties.point_data.description
Dictionary mapping skill names to point values. Example: {'skill_name': 5}

# components.schemas.BlockSkillPointInfoRequest.properties.overwrite.description
If True, removes all skills not in point_data. If False, only updates specified skills.

# components.schemas.BulkCourseInvitationCreate.properties.platform_key.description
The platform key for permission validation

# components.schemas.BulkCourseInvitationResponse.description
Response serializer for bulk invitation creation

# components.schemas.BulkCourseInvitationResponse.properties.successes.description
Number of successfully created invitations

# components.schemas.BulkCourseInvitationResponse.properties.error_codes.description
List of error codes for failed invitations

# components.schemas.BulkPlatformInvitationCreate.properties.platform_key.description
The platform key for permission validation

# components.schemas.BulkPlatformInvitationResponse.description
Response serializer for bulk invitation creation

# components.schemas.BulkPlatformInvitationResponse.properties.successes.description
Number of successfully created invitations

# components.schemas.BulkPlatformInvitationResponse.properties.error_codes.description
List of error codes for failed invitations

# components.schemas.BulkProgramInvitationCreate.properties.platform_key.description
The platform key for permission validation

# components.schemas.BulkProgramInvitationResponse.description
Response serializer for bulk invitation creation

# components.schemas.BulkProgramInvitationResponse.properties.successes.description
Number of successfully created invitations

# components.schemas.BulkProgramInvitationResponse.properties.error_codes.description
List of error codes for failed invitations

# components.schemas.BulkSuggestionResponse.description
Response serializer for bulk suggestion operation results

# components.schemas.BulkSuggestionResponse.properties.successes.description
Number of successfully created suggestions

# components.schemas.BulkSuggestionResponse.properties.error_codes.description
List of error codes for failed suggestions

# components.schemas.BusinessTypeEnum.description
* `individual` - individual
* `company` - company

# components.schemas.CallAuthenticationRequest.description
Serializer for IBL Call Pro authentication request.

# components.schemas.CallAuthenticationRequest.properties.pathway.description
The pathway identifier for the call context

# components.schemas.CallAuthenticationRequest.properties.enable_video.description
Whether to enable video during the call. Required for screensharing and video calls to work.

# components.schemas.CallAuthenticationResponse.description
Serializer for IBL Call Pro authentication parameters.

# components.schemas.CallAuthenticationResponse.properties.ws_url.description
The WebSocket URL for the IBL Call Pro server

# components.schemas.CallAuthenticationResponse.properties.participant_name.description
The name of the participant joining the room

# components.schemas.CallAuthenticationResponse.properties.participant_token.description
The JWT token for authenticating the participant

# components.schemas.CallConfiguration.properties.language.description
Language code for TTS, STT, and LLM (e.g., 'en', 'en-US', 'es', 'fr'). Defaults to 'en' (English).

# components.schemas.CallConfiguration.properties.use_function_calling_for_rag.description
Whether to use function calls in the agent or force RAG calls before LLM generation

# components.schemas.CallConfiguration.properties.enable_video.description
Whether to enable video for the call. (applicable only for realtime mode)

# components.schemas.CallConfiguration.properties.screensharing_system_prompt.description
System prompt to use for screensharing guidance. Defaults to VIDEO_GUIDANCE_PROMPT from constants.

# components.schemas.CallConfiguration.properties.screensharing_proactive_prompt.description
Proactive prompt used during screensharing calls to guide the conversation.

# components.schemas.CallConfigurationModeEnum.description
* `realtime` - Realtime
* `inference` - Inference

# components.schemas.CampaignEnablement.description
Serializer for campaign enablement requests.

# components.schemas.CampaignEnablement.properties.email.description
Email address to enable for the campaign

# components.schemas.CampaignExclusion.description
Serializer for campaign exclusion requests.

# components.schemas.CampaignExclusion.properties.email.description
Email address to exclude from the campaign

# components.schemas.CatalogAutoIncrementUpdateRequest.description
Serializer for auto increment update request parameters.

# components.schemas.CatalogAutoIncrementUpdateRequest.properties.number_type.description
Type of number requested (e.g., course, program, pathway)

# components.schemas.CeleryHeartbeatFailStatusEnum.description
* `unhealthy` - unhealthy
* `healthy` - healthy

# components.schemas.CeleryHeartbeatStatusEnum.description
* `healthy` - healthy
* `unhealthy` - unhealthy

# components.schemas.ChatPrivacyModeEnum.description
* `normal` - Normal
* `anonymized` - Anonymized
* `disabled` - Disabled

# components.schemas.ChatRunTrackerStatusEnum.description
* `started` - Started
* `completed` - Completed
* `failed` - Failed

# components.schemas.ChatSessionRequest.properties.tools.description
List of tools slugs to use. Passing `null` will use all tools assigned to the mentor. For no tools, pass an empty list.

# components.schemas.ChatSessionRequest.properties.shareable_link_token.description
Optional token for a mentor's shareable link

# components.schemas.ChatSessionRequest.properties.disable_chathistory.description
Per-session privacy override. When true, no ChatMessageHistory rows are written for this conversation and the session is not linked to the user. Honored only when the tenant has ALLOW_USER_CHAT_PRIVACY_CONTROL enabled and the mentor has not set disable_chathistory.

# components.schemas.CheckoutSessionResponse.description
Response returned after creating a Stripe checkout session.

# components.schemas.ClawConfigGetResponse.description
Documents the ``config.get`` payload shape.

Secrets in ``config`` / ``parsed`` are replaced with the literal
``"__OPENCLAW_REDACTED__"`` sentinel.

# components.schemas.ClawInstance.properties.provision_mode.description
Managed = provisioned by us. Self-hosted = tenant provides the server.

* `managed` - Managed
* `self_hosted` - Self-hosted

# components.schemas.ClawInstance.properties.deployment_backend.description
Backend that deployed this server. Null = manually configured.

# components.schemas.ClawInstance.properties.auth_headers.description
Per-server auth headers (overrides backend defaults).

# components.schemas.ClawInstance.properties.connection_params.description
Variant-specific connection parameters (write-only in API). OpenClaw: device_identity.private_key_pem, timeouts. IronClaw: typically empty (bearer token covered by gateway_token).

# components.schemas.ClawInstance.properties.last_pairing.description
The most recent device-pairing result (request id + fingerprint, or status), as written
by ``request_claw_pairing_task``. Read-only; transient (pairing requests expire ~5 min).

# components.schemas.ClawInstanceStatusEnum.description
* `active` - Active
* `inactive` - Inactive
* `error` - Error

# components.schemas.ClawMentorConfig.properties.agent_id.description
Worker-side agent id. System-minted from the mentor's unique_id on creation, immutable and read-only. Legacy configs may carry a hand-entered value such as 'main'.

# components.schemas.ClawMentorConfig.properties.auto_push.description
When True, saving the mentor's AgentConfig should trigger an async config push. Signal/hook not yet wired — currently a flag for future use.

# components.schemas.ClawMentorConfig.properties.last_push_warnings.description
Warnings from the last config push (baseline verification and per-agent skill upload).

# components.schemas.ClawModelProvider.properties.name.description
Provider identifier in the Claw config (e.g. 'minimax')

# components.schemas.ClawModelProvider.properties.credential_name.description
Name of the LLMCredential to resolve the API key from

# components.schemas.ClawModelProvider.properties.credential_key.description
Key within the LLMCredential value JSON to extract the API key

# components.schemas.ClawModelProvider.properties.model_catalog.description
List of {"id": "...", "name": "..."} entries for the provider model catalog

# components.schemas.ClawModelProvider.properties.models_mode.description
'merge' adds to built-in models, 'replace' uses only configured providers.

# components.schemas.ClawModelProvider.properties.credential_resolved.description
Check if the referenced LLMCredential exists for this platform.

# components.schemas.ClawRpcError.description
Error envelope returned when the RPC raises.

# components.schemas.ClawTypeEnum.description
* `openclaw` - Openclaw
* `ironclaw` - Ironclaw

# components.schemas.CloudMessageTypeEnum.description
* `FCM` - Firebase Cloud Message
* `GCM` - Google Cloud Message

# components.schemas.ConfigurationItem.description
Serializer for individual configuration items

# components.schemas.ConnectedService.description
Serializer for representing connected OAuth services.

Includes both the legacy `service` / `scope` string values and structured
representations so that consumers can reason about individual scope names.

# components.schemas.ConnectedService.properties.scope_names.description
Return the canonical list of scope identifiers for the connection.

# components.schemas.ConnectedService.properties.scopes.description
Return the OAuth scope strings associated with the connection.

# components.schemas.ConnectedService.properties.username.description
Return the username strings associated with the connection.

# components.schemas.ConsumerChannel.properties.name.description
Channel name (e.g. email, push_notification)

# components.schemas.ContentAnalytics.description
Serializer for individual content item analytics.

# components.schemas.ContentAnalytics.properties.total_time_spent.description
Total time spent on this content in seconds (courses only)

# components.schemas.ContentAnalytics.properties.avg_time_per_learner.description
Average time spent per learner in seconds (courses only)

# components.schemas.ContentAverages.description
Serializer for content summary averages.

# components.schemas.ContentAverages.properties.time_per_learner.description
Average time spent per learner in seconds (courses only)

# components.schemas.ContentDetailsContentInfo.description
Serializer for the content information block.

# components.schemas.ContentDetailsContentInfo.properties.type.description
Content type (course, program, pathway, skill)

# components.schemas.ContentDetailsContentInfo.properties.external.description
Whether the content is external to the platform

# components.schemas.ContentDetailsContentInfo.properties.metadata.description
Metadata associated with the content item

# components.schemas.ContentDetailsLearner.description
Serializer for individual learner entries in content details.

# components.schemas.ContentDetailsLearner.properties.enrollment_date.description
Date the learner enrolled in the content

# components.schemas.ContentDetailsLearner.properties.rating.description
Learner rating for the content, if available

# components.schemas.ContentDetailsPagination.description
Serializer for pagination information in content details response.

# components.schemas.ContentDetailsResponse.description
Serializer for the content details API response.

# components.schemas.ContentDetailsSummary.description
Serializer for summary data in the content details endpoint.

# components.schemas.ContentDetailsSummary.properties.totals.description
Total counts related to the content item

# components.schemas.ContentDetailsSummary.properties.averages.description
Average values related to the content item

# components.schemas.ContentDetailsSummary.properties.time_series.description
Optional time series data for the requested metric

# components.schemas.ContentDetailsTimeSeries.description
Serializer describing the time series block.

# components.schemas.ContentDetailsTimeSeriesPoint.description
Serializer for individual time series points in content details response.

# components.schemas.ContentDetailsTimeSeriesPoint.properties.period.description
ISO8601 timestamp representing the aggregated period

# components.schemas.ContentDetailsTimeSeriesPoint.properties.value.description
Value for the requested metric during the period

# components.schemas.ContentDetailsTimeSeriesPoint.properties.average.description
Average value for the period (used for ratings)

# components.schemas.ContentItem.description
Serializer for individual content items.

# components.schemas.ContentItem.properties.external.description
Whether content is external to the platform

# components.schemas.ContentPagination.description
Serializer for content pagination metadata.

# components.schemas.ContentResponse.description
Serializer for the complete content API response.

# components.schemas.ContentResponse.properties.metric.description
The metric type (course, program, pathway, skill)

# components.schemas.ContentSummary.properties.overtime.description
Time spent over time data (courses only, when include_overtime=true)

# components.schemas.ContentTotals.properties.total_time_spent.description
Total time spent in seconds (courses only)

# components.schemas.ContentTotals.properties.associated_courses.description
Number of courses associated with skills

# components.schemas.ContextResponse.description
Response serializer for context endpoint

# components.schemas.Conversations.properties.lti_email.description
Email claim from LTI1.3 JWT if an LTI user and available

# components.schemas.Conversations.properties.lti_username.description
Username claim from LTI1.3 JWT if an LTI user and available

# components.schemas.Conversations.properties.is_authenticated.description
False if session was created by an anonymous user

# components.schemas.Conversations.properties.disable_chathistory.description
Per-session override that skips writing ChatMessageHistory rows for this conversation. Honored only when the tenant has ALLOW_USER_CHAT_PRIVACY_CONTROL enabled. Mirrors Mentor.disable_chathistory but scoped to one session.

# components.schemas.Conversations.properties.title.description
AI-generated title summarizing the conversation

# components.schemas.Conversations.properties.is_conversation.description
True if the session has both user and AI messages

# components.schemas.Course.properties.course_id.description
The edX course ID string for the course.

# components.schemas.Course.properties.name.description
The display name of the course. (Should match edX)

# components.schemas.Course.properties.slug.description
An additional unique slug field. (Optional)

# components.schemas.CourseAccessRequestCreate.properties.platform_org.description
The organization identifier for the platform

# components.schemas.CourseAccessRequestDetail.description
Response serializer for access request details

# components.schemas.CourseAccessRequestDetail.properties.id.description
The unique identifier for the access request

# components.schemas.CourseAccessRequestDetail.properties.username.description
The username of the user who made the request

# components.schemas.CourseAccessRequestDetail.properties.name.description
The full name of the user who made the request

# components.schemas.CourseAccessRequestDetail.properties.approved.description
Whether the request has been approved (null if not reviewed)

# components.schemas.CourseAccessRequestDetail.properties.platform_key.description
The platform key associated with the request

# components.schemas.CourseAccessRequestDetail.properties.course_id.description
The course ID associated with the request

# components.schemas.CourseAccessRequestStatusResponse.properties.approved.description
Whether the access request has been approved (null if not reviewed)

# components.schemas.CourseAccessRequestStatusResponse.properties.exists.description
Whether an access request exists for this user and course

# components.schemas.CourseAccessRequestUpdate.properties.platform_org.description
The organization identifier for the platform

# components.schemas.CourseAccessRequestUpdate.properties.active.description
Whether the request should remain active

# components.schemas.CourseCompletionSummaryDataOvertime.properties.overtime.description
Dates are keys and values are the value for the date in the key. e,g `{"2020-01-01": 30. ...}`

# components.schemas.CourseCompletionSummaryDataOvertime.properties.total_user_count.description
Total unique active users in this period

# components.schemas.CourseCreateUpdate.description
Serializer for course creation/update request body.

# components.schemas.CourseCreateUpdate.properties.org.description
The organization associated with the course

# components.schemas.CourseCreationTask.properties.description.description
Description of the course to create and its requirements

# components.schemas.CourseCreationTask.properties.target_audience.description
The intended audience for the course. eg. Grade 11 students.

# components.schemas.CourseCreationTask.properties.assessment_mentor.description
Optional. If set, mentor-graded assessment xblocks in the created course point at this mentor instead of provisioning a new one per unit.

# components.schemas.CourseCreationTaskStatusEnum.description
* `Pending` - Pending
* `Scheduled` - Scheduled
* `Success` - Success
* `Failed` - Failed
* `Cancelled` - Cancelled
* `In Progress` - In Progress

# components.schemas.CourseDeleteResponse.description
Serializer for course deletion response.

# components.schemas.CourseDetail.properties.time_spent.description
Total time spent on this course in human-readable format (e.g., '1h 30m')

# components.schemas.CourseDetail.properties.time_spent_secs.description
Total time spent on this course in seconds

# components.schemas.CourseDetail.properties.edx_progress.description
Full edX Progress-page payload (completion summary, grade, grade summary) for this learner in this course. Only present when the request scopes a single `course_id` with `include_edx_progress` enabled; null if the edX call fails.

# components.schemas.CourseEnrollmentSearchResponse.description
Serializer for course enrollment search results.

# components.schemas.CourseEnrollmentSearchResponse.properties.course_id.description
Course ID associated with the enrollment

# components.schemas.CourseExportEligibility.description
Full CRUD serializer for course export eligibility records.

# components.schemas.CourseGradeSummaryData.properties.average_weighted_grade.description
Assignment weighted grade average in course

# components.schemas.CourseGradeSummaryData.properties.average_section_grade.description
Assignment section grade average in course

# components.schemas.CourseGroupSuggestionCreate.properties.department_mode.description
Flag to ensure department admins can call the API

# components.schemas.CourseGroupSuggestionDetail.description
Response serializer for course group suggestion details

# components.schemas.CourseGroupSuggestionDetail.properties.id.description
The unique identifier for the group suggestion

# components.schemas.CourseGroupSuggestionDetail.properties.group_id.description
The ID of the group receiving the suggestion

# components.schemas.CourseGroupSuggestionDetail.properties.group_name.description
The name of the group receiving the suggestion

# components.schemas.CourseGroupSuggestionDetail.properties.platform_key.description
The platform key associated with the suggestion

# components.schemas.CourseGroupSuggestionDetail.properties.accepted.description
Whether the suggestion has been accepted

# components.schemas.CourseInvitationCreate.description
Request serializer for CourseInvitationView POST endpoint.

Supports CSV date fields for enrollment_config:
- course_access_start_date: Maps to enrollment_config['started']
- course_access_expiration_date: Maps to enrollment_config['expired']

# components.schemas.CourseInvitationCreate.properties.redirect_to.description
URL to redirect to after accepting the invitation

# components.schemas.CourseInvitationCreate.properties.course_access_start_date.description
Course access start date (maps to enrollment_config['started'])

# components.schemas.CourseInvitationCreate.properties.course_access_expiration_date.description
Course access expiration date (maps to enrollment_config['expired'])

# components.schemas.CourseInvitationDetail.description
Response serializer for course invitation details

# components.schemas.CourseInvitationDetail.properties.id.description
The unique identifier for the invitation

# components.schemas.CourseInvitationDetail.properties.user_id.description
The ID of the user associated with the invitation

# components.schemas.CourseInvitationDetail.properties.username.description
The username of the user associated with the invitation

# components.schemas.CourseInvitationDetail.properties.email.description
The email address associated with the invitation

# components.schemas.CourseInvitationDetail.properties.redirect_to.description
URL to redirect to after accepting the invitation

# components.schemas.CourseInvitationDetail.properties.course_id.description
The course ID associated with the invitation

# components.schemas.CourseInvitationRedemption.properties.source.description
The source identifier for the invitation

# components.schemas.CourseInvitationRedemption.properties.email.description
The email to associate with the invitation

# components.schemas.CourseInvitationRedemption.properties.username.description
The username to associate with the invitation

# components.schemas.CourseLicenseAssignmentCreate.properties.platform_org.description
The organization identifier for the platform

# components.schemas.CourseLicenseAssignmentCreate.properties.fulfilled.description
Whether the assignment has been fulfilled

# components.schemas.CourseLicenseAssignmentDetail.description
Response serializer for course license assignment details

# components.schemas.CourseLicenseAssignmentDetail.properties.id.description
The unique identifier for the assignment

# components.schemas.CourseLicenseAssignmentDetail.properties.username.description
The username of the user assigned the license

# components.schemas.CourseLicenseAssignmentDetail.properties.email.description
The email address of the user assigned the license

# components.schemas.CourseLicenseAssignmentDetail.properties.fulfilled.description
Whether the assignment has been fulfilled

# components.schemas.CourseLicenseAssignmentDetail.properties.course_id.description
The course ID associated with the license

# components.schemas.CourseLicenseCreate.description
Request serializer for CourseLicenseCreateView POST endpoint

# components.schemas.CourseLicenseCreate.properties.platform_org.description
The organization identifier for the platform

# components.schemas.CourseLicenseDetail.description
Response serializer for course license details

# components.schemas.CourseLicenseDetail.properties.platform_key.description
The platform key associated with the license

# components.schemas.CourseLicenseDetail.properties.course_id.description
The course ID associated with the license

# components.schemas.CourseLicenseGroupAssignmentCreate.properties.platform_org.description
The organization identifier for the platform

# components.schemas.CourseLicenseGroupAssignmentCreate.properties.fulfilled.description
Whether the assignment has been fulfilled

# components.schemas.CourseLicenseGroupAssignmentDetail.description
Response serializer for course license group assignment details

# components.schemas.CourseLicenseGroupAssignmentDetail.properties.id.description
The unique identifier for the assignment

# components.schemas.CourseLicenseGroupAssignmentDetail.properties.group_id.description
The ID of the group assigned the license

# components.schemas.CourseLicenseGroupAssignmentDetail.properties.group_name.description
The name of the group assigned the license

# components.schemas.CourseLicenseGroupAssignmentDetail.properties.fulfilled.description
Whether the assignment has been fulfilled

# components.schemas.CourseLicenseGroupAssignmentDetail.properties.course_id.description
The course ID associated with the license

# components.schemas.CourseLicenseUpdate.description
Request serializer for CourseLicenseUpdateView POST endpoint

# components.schemas.CourseLicenseUpdate.properties.license_id.description
The ID of the license to update (required if external_id not provided)

# components.schemas.CourseLicenseUpdate.properties.external_id.description
External identifier of the license to update (required if license_id not provided)

# components.schemas.CourseLicenseUpdate.properties.platform_org.description
The platform organization (not updatable)

# components.schemas.CourseMetadataSearchRequest.description
Serializer for course metadata search request body.

# components.schemas.CourseMetadataUpdateRequest.description
Serializer for course metadata update request body.

# components.schemas.CourseMetadataUpdateRequest.properties.update.description
Whether to update (True) or overwrite (False) existing metadata

# components.schemas.CoursePoint.properties.course_id.description
The edX course ID string for the course.

# components.schemas.CourseRecommendation.description
Individual course recommendation with reasoning.

# components.schemas.CourseRecommendation.properties.reason.description
AI-generated explanation for why this course is recommended

# components.schemas.CourseRecommendation.properties.confidence_score.description
AI confidence in this recommendation (0-1)

# components.schemas.CourseRecommendation.properties.platform_key.description
Platform/tenant key this course belongs to (extracted from course_id or metadata)

# components.schemas.CourseRecommendation.properties.description.description
Course description (priority: description > short_description > overview with HTML stripped)

# components.schemas.CourseRecommendation.properties.edx_data.description
Full edx_data from CourseInfo model (includes all edX metadata)

# components.schemas.CourseReviewInfoResponse.description
Serializer for course review info response.

# components.schemas.CourseReviewInfoResponse.properties.course_id.description
The course ID associated with the reviews

# components.schemas.CourseReviewPaginatedResponse.description
Paginated response serializer for CourseReviewQueryView GET endpoint.

# components.schemas.CourseReviewRequest.description
Request serializer for CourseReviewUpdateView POST endpoint.

# components.schemas.CourseReviewRequest.properties.user_id.description
The user ID of the reviewer (alternative to username)

# components.schemas.CourseReviewResponse.description
Response serializer for CourseReviewQueryView GET endpoint.
Matches the actual structure returned by review.to_json()

# components.schemas.CourseSkill.properties.course_id.description
The edX course ID string for the course.

# components.schemas.CourseSkillPointInfoRequest.description
Request serializer for CourseSkillPointInfoView POST endpoint.
Validates request body for updating course skill point information.

# components.schemas.CourseSkillPointInfoRequest.properties.course_id.description
ID of the course to update skill point information for

# components.schemas.CourseSkillPointInfoRequest.properties.point_data.description
Dictionary mapping skill names to point values. Example: {'skill_name': 5}

# components.schemas.CourseSkillPointInfoRequest.properties.overwrite.description
If True, removes all skills not in point_data. If False, only updates specified skills.

# components.schemas.CourseSuggestionBulkCreate.properties.suggestion_data.description
List of suggestion data objects, each containing course_id, user_id, etc.

# components.schemas.CourseSuggestionBulkCreate.properties.department_mode.description
Flag to ensure department admins can call the API

# components.schemas.CourseSuggestionCreate.properties.username.description
The username of the user to suggest the course to

# components.schemas.CourseSuggestionCreate.properties.email.description
The email of the user to suggest the course to

# components.schemas.CourseSuggestionCreate.properties.department_mode.description
Flag to ensure department admins can call the API

# components.schemas.CourseSuggestionDetail.description
Response serializer for course suggestion details

# components.schemas.CourseSuggestionDetail.properties.id.description
The unique identifier for the suggestion

# components.schemas.CourseSuggestionDetail.properties.user_id.description
The ID of the user receiving the suggestion

# components.schemas.CourseSuggestionDetail.properties.username.description
The username of the user receiving the suggestion

# components.schemas.CourseSuggestionDetail.properties.name.description
The full name of the user receiving the suggestion

# components.schemas.CourseSuggestionDetail.properties.platform_key.description
The platform key associated with the suggestion

# components.schemas.CourseSuggestionDetail.properties.accepted.description
Whether the suggestion has been accepted by the user

# components.schemas.CourseSuggestionDetail.properties.visible.description
Whether the suggestion is visible to the user

# components.schemas.CoursesProgressFrequencyEnum.description
* `DAILY` - DAILY
* `WEEKLY` - WEEKLY
* `MONTHLY` - MONTHLY
* `CUSTOM` - CUSTOM

# components.schemas.CreateXblock.description
Validate input for creating an xblock under a parent.

# components.schemas.CreateXblock.properties.xblock_type.description
The type of block to create (section, subsection, unit, html, problem, video).

* `section` - section
* `subsection` - subsection
* `unit` - unit
* `html` - html
* `problem` - problem
* `video` - video

# components.schemas.CreateXblock.properties.position.description
Position within the parent ('first', 'last', or a 1-based index).

# components.schemas.CreateXblock.properties.content.description
HTML content body. Only used for html/problem component types.

# components.schemas.CreateXblock.properties.markdown.description
Markdown source. Only used for problem (multiplechoice) components.

# components.schemas.CredentialProviderConfig.description
Serializer for CredentialProviderConfig model.

Serializes provider configuration including platform, provider name,
config JSON, enabled status, and timestamps.

# components.schemas.CredentialProviderConfig.properties.provider_name_display.description
Get display name from provider if available, otherwise use provider_name.

# components.schemas.CredentialProviderConfig.properties.config.description
Provider-specific configuration in JSON format

# components.schemas.CredentialProviderConfig.properties.enabled.description
Whether this provider integration is enabled for the platform

# components.schemas.CredentialRequest.properties.name.description
Name of the credential provider (e.g., 'openai', 'google-drive')

# components.schemas.CredentialRequest.properties.value.description
Credential data for the provider (API keys, service account details, etc.)

# components.schemas.CredentialRequest.properties.platform.description
Organization key identifier for the tenant

# components.schemas.CreditAccountAutoRechargeUpdate.description
Partial update for CreditAccount auto-recharge fields.

# components.schemas.CreditAccountAutoRechargeUpdate.properties.auto_recharge_threshold_usd.description
Set the balance threshold for auto-recharge (must be non-negative).

# components.schemas.CreditAccountAutoRechargeUpdate.properties.auto_recharge_spending_limit_usd.description
Cap on auto-recharge + manual top-up per 30-day period (user USD). 0 = unlimited. When > 0, backend sets recharge amount to 20% of limit (min $0.50).

# components.schemas.CreditAccountAutoRechargeUpdate.properties.platform_key.description
The platform key to update settings for (read-only in update context).

# components.schemas.CreditAccountInfo.description
Credit account information API response (GET).

Display balance (has_credits, account_id, available_credits) and
auto-recharge preferences.

# components.schemas.CreditAccountInfo.properties.has_credits.description
True if the account has any credits (or infinite credits).

# components.schemas.CreditAccountInfo.properties.account_id.description
The unique identifier of the credit account.

# components.schemas.CreditAccountInfo.properties.available_credits.description
The current available credit balance in USD.

# components.schemas.CreditAccountInfo.properties.auto_recharge_threshold_usd.description
The balance threshold below which auto-recharge is triggered.

# components.schemas.CreditAccountInfo.properties.auto_recharge_amount_usd.description
The amount in USD to recharge when the threshold is reached.

# components.schemas.CreditAccountInfo.properties.auto_recharge_enabled.description
True if auto-recharge is currently enabled for this account.

# components.schemas.CreditAccountInfo.properties.auto_recharge_last_triggered_at.description
The timestamp when auto-recharge was last successfully triggered.

# components.schemas.CreditAccountInfo.properties.platform_key.description
The platform key associated with this account (if applicable).

# components.schemas.CreditAccountInfo.properties.pricing_table.description
Stripe pricing table details for topping up credits.

# components.schemas.CreditAccountInfo.properties.free_trial.description
True if the account is on the free trial plan (no paid plan purchased yet).

# components.schemas.CreditAccountInfo.properties.current_plan.description
Current plan identifier, e.g. 'free_trial' or Stripe product SKU.

# components.schemas.CreditAccountInfo.properties.can_use_auto_recharge.description
True if the current plan is not free_trial (paid plans can use auto-recharge).

# components.schemas.CreditAccountInfo.properties.has_payment_method.description
True if the user has a payment method on file (can use manual top-up and auto-recharge).

# components.schemas.CreditAccountInfo.properties.is_owner.description
True if the requesting user is the user that owns this credit account (account.user).

# components.schemas.CreditAccountInfo.properties.message.description
Message explaining why credits are insufficient (only present when has_credits is False).

# components.schemas.CreditTransactionHistory.description
Serializer for user-facing transaction history.
NEVER exposes internal USD amounts (amount_usd, usd_balance_*).

- payment_amount_usd: only shown for ``add`` transactions (real user payment).
- description: user-friendly label derived from service_name/transaction_type.
- service_name is excluded from the response (internal detail).

# components.schemas.CreditTransactionHistoryStatusEnum.description
* `pending` - Pending
* `completed` - Completed
* `failed` - Failed
* `cancelled` - Cancelled

# components.schemas.CronDelivery.description
Delivery target for a cron run's announce/webhook output.

# components.schemas.CronDeliveryModeEnum.description
* `none` - none
* `announce` - announce
* `webhook` - webhook

# components.schemas.CronJobCreate.description
Body for ``POST cron-jobs/`` — sent to ``cron.add``.

Field names use camelCase / snake_case as appropriate so they map 1:1 to
the OpenClawClient wrapper kwargs.

# components.schemas.CronJobResponse.description
Documentation-only — describes the ``CronJob`` shape worker returns.

The view returns the raw dict from the RPC; this serializer is wired into
``@extend_schema(responses=...)`` so drf-spectacular knows the shape but
we don't bother running it on output (the wire dict is authoritative).

# components.schemas.CronPayload.description
Discriminated union on ``kind``.

- ``systemEvent``: requires ``text``.
- ``agentTurn``: requires ``message``; accepts model/fallbacks/etc.

# components.schemas.CronPayloadKindEnum.description
* `systemEvent` - systemEvent
* `agentTurn` - agentTurn

# components.schemas.CronRunLogEntry.description
One row from ``cron.runs.entries`` — the ``finished`` snapshot.

# components.schemas.CronRunLogEntryStatusEnum.description
* `ok` - ok
* `error` - error
* `skipped` - skipped

# components.schemas.CronSchedule.description
Discriminated union on ``kind``.

- ``at``: one-shot at an ISO 8601 instant — requires ``at``.
- ``every``: interval — requires ``everyMs`` (≥ 1).
- ``cron``: cron expression — requires ``expr``.

# components.schemas.CronScheduleKindEnum.description
* `at` - at
* `every` - every
* `cron` - cron

# components.schemas.CronStatusResponse.description
Documents the ``cron.status`` response.

The upstream shape (scheduler health summary from ``context.cron.status()``)
is not fully pinned in the published docs; fields here are best-effort.
Additional fields may be present.

# components.schemas.CrontabSchedule.properties.minute.description
Cron Minutes to Run. Use "*" for "all". (Example: "0,30")

# components.schemas.CrontabSchedule.properties.hour.description
Cron Hours to Run. Use "*" for "all". (Example: "8,20")

# components.schemas.CrontabSchedule.properties.day_of_week.description
Cron Days Of The Week to Run. Use "*" for "all", Sunday is 0 or 7, Monday is 1. (Example: "0,5")

# components.schemas.CrontabSchedule.properties.day_of_month.description
Cron Days Of The Month to Run. Use "*" for "all". (Example: "1,15")

# components.schemas.CrontabSchedule.properties.month_of_year.description
Cron Months (1-12) Of The Year to Run. Use "*" for "all". (Example: "1,12")

# components.schemas.CustomInstructionResponse.properties.profession.description
Position or work. eg: Engineer, student etc.

# components.schemas.CustomInstructionResponse.properties.desired_mentor_traits.description
Comma separated list of expected traits for mentor.

# components.schemas.DataTypeEnum.description
* `NUMERIC` - NUMERIC
* `BOOLEAN` - BOOLEAN
* `CATEGORICAL` - CATEGORICAL

# components.schemas.DatasetItem.description
Read shape for a dataset item.

``trace_input`` / ``trace_output`` are present whenever ``source_trace_id``
is set (values may be ``null`` if the trace can't be resolved); the keys
are omitted otherwise.

# components.schemas.DatasetItemCreate.description
Validates dataset item creation — either from direct items or trace IDs.

Exactly one of ``items`` or ``trace_ids`` must be provided.

# components.schemas.DatasetItemInput.description
Single dataset item with input and optional expected output.

# components.schemas.DatasetItemUpdateStatusEnum.description
* `ACTIVE` - ACTIVE
* `ARCHIVED` - ARCHIVED

# components.schemas.DatasetRunItem.description
A fully-expanded dataset run item: input/expected/actual + scores.

# components.schemas.Deal.description
Adds a read-only ``tags`` field to a host serializer.

Emits ``[{id, name, color}]``. Cheap when the host queryset uses
``prefetch_related("tag_assignments__tag")`` — without that prefetch
every record triggers two extra queries.

# components.schemas.Deal.properties.platform.description
Platform this Deal belongs to. Set automatically from your credentials; you cannot pass another Platform's id.

# components.schemas.Deal.properties.title.description
Short display name (e.g. 'Acme renewal — 2026').

# components.schemas.Deal.properties.description.description
Free-text notes about scope, requirements, etc.

# components.schemas.Deal.properties.status.description
Read-only. Set by the move-stage/won/lost actions and derived from the destination stage's `is_won`/`is_lost`. Direct writes are rejected with `400`; use `POST /deals/{id}/move-stage/` (or `won/` / `lost/`).

* `open` - Open
* `won` - Won
* `lost` - Lost

# components.schemas.Deal.properties.lost_reason.description
Set on a `lost` transition (e.g. 'Chose competitor').

# components.schemas.Deal.properties.expected_close_date.description
Forecasted close date — used by revenue projections.

# components.schemas.Deal.properties.closed_at.description
Read-only. Set automatically when the Deal enters a won/lost stage and cleared when it re-opens.

# components.schemas.Deal.properties.person.description
UUID of the primary contact for this Deal. The person must belong to your Platform.

# components.schemas.Deal.properties.organization.description
UUID of an organization the Deal is with. Optional; must belong to your Platform.

# components.schemas.Deal.properties.pipeline.description
Pipeline this Deal flows through. Must belong to your Platform.

# components.schemas.Deal.properties.stage.description
Current PipelineStage. On create, must belong to `pipeline`. Use `POST /deals/{id}/move-stage/` to change after creation.

# components.schemas.Deal.properties.source.description
Where the Deal originated. Optional; must belong to your Platform.

# components.schemas.Deal.properties.owner.description
Id of the platform user responsible for this Deal (sales rep). Defaults to the calling user on create.

# components.schemas.Deal.properties.metadata.description
Free-form JSON for Platform-defined attributes.

# components.schemas.DealLostRequest.properties.stage_code.description
Optional `code` of a specific `is_lost=True` stage to move to. When omitted, the first lost stage in the pipeline (by sort order) is used.

# components.schemas.DealMoveStageRequest.properties.stage_id.description
Id of the destination PipelineStage. One of `stage_id` or `stage_code` is required.

# components.schemas.DealMoveStageRequest.properties.stage_code.description
Stable `code` of the destination PipelineStage within this Deal's Pipeline. Use this when integrating across environments where ids differ but codes are stable.

# components.schemas.DealStatusEnum.description
* `open` - Open
* `won` - Won
* `lost` - Lost

# components.schemas.DealWonRequest.properties.stage_code.description
Optional `code` of a specific `is_won=True` stage to move to. When omitted, the first won stage in the pipeline (by sort order) is used.

# components.schemas.DeliveryStatusEnum.description
* `delivered` - delivered
* `not-delivered` - not-delivered
* `unknown` - unknown
* `not-requested` - not-requested

# components.schemas.DemographicsFieldDefinition.properties.name.description
Human-readable field label displayed in forms.

# components.schemas.DemographicsFieldDefinition.properties.slug.description
URL-safe identifier used as the key in custom_fields payloads.

# components.schemas.DemographicsFieldDefinition.properties.field_type.description
Data type for this field. One of: text, number, date, boolean, select, multi_select.

* `text` - Text
* `number` - Number
* `date` - Date
* `boolean` - Boolean
* `select` - Select
* `multi_select` - Multi-select

# components.schemas.DemographicsFieldDefinition.properties.required.description
Whether this field must be filled in by the user.

# components.schemas.DemographicsFieldDefinition.properties.choices.description
List of valid options for select/multi_select fields. Must be empty for other types.

# components.schemas.DemographicsFieldDefinition.properties.display_order.description
Sort order for rendering fields in the UI. Lower values appear first.

# components.schemas.DemographicsFieldDefinition.properties.active.description
Inactive fields are hidden from forms and excluded from responses.

# components.schemas.DemographicsFieldDefinition.properties.description.description
Optional description or instructions shown alongside the field.

# components.schemas.DemographicsFieldDefinitionWrite.properties.name.description
Human-readable field label displayed in forms.

# components.schemas.DemographicsFieldDefinitionWrite.properties.slug.description
URL-safe identifier used as the key in custom_fields payloads.

# components.schemas.DemographicsFieldDefinitionWrite.properties.field_type.description
Data type for this field. One of: text, number, date, boolean, select, multi_select.

* `text` - Text
* `number` - Number
* `date` - Date
* `boolean` - Boolean
* `select` - Select
* `multi_select` - Multi-select

# components.schemas.DemographicsFieldDefinitionWrite.properties.required.description
Whether this field must be filled in by the user.

# components.schemas.DemographicsFieldDefinitionWrite.properties.choices.description
List of valid options for select/multi_select fields. Must be empty for other types.

# components.schemas.DemographicsFieldDefinitionWrite.properties.display_order.description
Sort order for rendering fields in the UI. Lower values appear first.

# components.schemas.DemographicsFieldDefinitionWrite.properties.active.description
Inactive fields are hidden from forms and excluded from responses.

# components.schemas.DemographicsFieldDefinitionWrite.properties.description.description
Optional description or instructions shown alongside the field.

# components.schemas.DeployStateEnum.description
* `pending` - Pending
* `deploying` - Deploying
* `ready` - Ready
* `teardown` - Teardown
* `failed` - Failed

# components.schemas.DesiredRoleCreateUpdateRequest.description
Serializer for desired role creation/update request parameters.

# components.schemas.DesiredRoleCreateUpdateRequest.properties.roles.description
List of roles (can be role IDs or objects with name, platform_key, etc.)

# components.schemas.DesiredSkillCreateUpdateRequest.description
Serializer for desired skill creation/update request parameters.

# components.schemas.DesiredSkillCreateUpdateRequest.properties.skills.description
List of skills (can be skill IDs or objects with name, platform_key, etc.)

# components.schemas.DisabilityStatusEnum.description
* `yes` - Yes
* `no` - No
* `prefer_not_to_say` - Prefer not to say

# components.schemas.Disclaimer.properties.platform.description
Platform to which the disclaimer applies. 

# components.schemas.DisclaimerScopeEnum.description
* `platform` - Platform
* `mentor` - Mentor

# components.schemas.Document.properties.last_modified.description
Date when the document was last modified

# components.schemas.DocumentSearchResponse.properties.results.description
List of documents matching the search criteria

# components.schemas.DocumentSearchResponse.properties.count.description
Total number of documents matching the search criteria

# components.schemas.EdxJwtToken.description
edX JWT minted server-to-server for the user (provisioning only).

# components.schemas.EngagementPerCourseData.properties.average_days.description
Average days spent by each learners on the course

# components.schemas.EngagementPerCourseData.properties.average_time_spent.description
Average days spent by learner on the course

# components.schemas.EntityTypeEnum.description
* `user` - user
* `platform` - platform
* `global` - global

# components.schemas.ErrorDetail.description
Schema for error responses with a single detail message (e.g. 400).

# components.schemas.EthnicityEnum.description
* `american_indian_alaska_native` - American Indian or Alaska Native
* `asian` - Asian
* `black_african_american` - Black or African American
* `hispanic_latino` - Hispanic or Latino
* `native_hawaiian_pacific_islander` - Native Hawaiian or Other Pacific Islander
* `white` - White
* `two_or_more` - Two or more races
* `prefer_not_to_say` - Prefer not to say
* `other` - Other

# components.schemas.EventsEnum.description
* `USER_NOTIF_COURSE_ENROLLMENT` - Course Enrollment
* `ADMIN_NOTIF_COURSE_ENROLLMENT` - Admin: Course Enrollment
* `USER_NOTIF_USER_INACTIVITY` - User Inactivity
* `USER_NOTIF_COURSE_COMPLETION` - Course Completion
* `USER_NOTIF_CREDENTIALS` - Credentials Issued
* `USER_NOTIF_LEARNER_PROGRESS` - Learner Progress
* `PROACTIVE_LEARNER_NOTIFICATION` - Proactive Learner Notification
* `ACTIVITY_NEW_CONTENT` - New Activity Content
* `ACTIVITY_COURSE_MILESTONE` - Course Milestone Reached
* `SKILL_MASTERY_CHANGE` - Skill Mastery Change
* `PROGRAM_ENROLLMENT_CONFIRMATION` - Program Enrollment Confirmed
* `PATHWAY_ENROLLMENT_CONFIRMATION` - Pathway Enrollment Confirmed
* `COURSE_SCHEDULE_CHANGE` - Course Schedule Change
* `COURSES_PROGRESS_SUMMARY` - Courses Progress Summary
* `SUBSECTION_GRADE_UPDATE` - Subsection Grade Update

# components.schemas.EximTask.description
Read-only serializer for EximTask records.

Tasks are created by the Course post_save signal and the admin sync
action; nothing should create or modify them through this API.

# components.schemas.EximTask.properties.published_at.description
Time the publish signal was received; used for FIFO ordering

# components.schemas.EximTask.properties.export_download_url.description
URL to download the exported course file

# components.schemas.EximTask.properties.import_filename.description
Filename of uploaded archive used to track import on target environment

# components.schemas.ExperimentCreate.description
Validates experiment (dataset run) creation.

# components.schemas.ExportTargetEnvironment.description
Full CRUD serializer for target environments.

The bearer ``token`` field is write-only so credentials never leak via
GET responses. Model-level validation (oauth credentials OR token must
be provided) is enforced by calling ``ExportTargetEnvironment.clean()``
during ``validate()``.

# components.schemas.ExportTargetEnvironment.properties.oauth_credentials.description
OAuth credentials for API authentication

# components.schemas.ExportTargetEnvironment.properties.token.description
Manual bearer token (fallback if OAuth not configured)

# components.schemas.ExternalCredentialMapping.description
Serializer for ExternalCredentialMapping model.

Serializes external credential mappings including credential, platform,
provider, external_template_id, and metadata.

# components.schemas.ExternalCredentialMapping.properties.provider_name_display.description
Get display name from provider if available, otherwise use provider_name.

# components.schemas.ExternalCredentialMapping.properties.external_template_id.description
The template ID in the external system (e.g., Accredible template ID)

# components.schemas.ExternalCredentialMapping.properties.group_id.description
The group ID in the external system (e.g., Accredible group ID). If not set, will fall back to the provider config's group_id.

# components.schemas.ExternalCredentialMapping.properties.metadata.description
Additional metadata stored as JSON (for general mapping information, not sync status)

# components.schemas.ExternalProxyInvoke.description
Serializer for invoking external proxy endpoints.

For multipart file uploads, send the file as a standard multipart form field
(e.g., 'file' field) alongside the JSON body. Files are extracted from
request.FILES and forwarded to the upstream service.

Example multipart request:
    - Form field 'body': JSON string with request body
    - Form field 'path_params': JSON string with path parameters
    - Form field 'query': JSON string with query parameters
    - Form field 'file': The binary file to upload

# components.schemas.ExternalProxyServiceDetail.description
Serializer for external proxy service details including endpoints.

# components.schemas.ExternalProxyServiceDetail.properties.credential_schema.description
Return the expected credential schema for this service.

# components.schemas.ExternalProxyServiceList.description
Serializer for listing external proxy services.

# components.schemas.FailureCategoryEnum.description
* `llm_error` - Llm Error
* `moderation_block` - Moderation Block
* `safety_block` - Safety Block
* `privacy_block` - Privacy Block
* `authentication_error` - Authentication Error
* `authorization_error` - Authorization Error
* `payment_error` - Payment Error
* `validation_error` - Validation Error
* `content_filter` - Content Filter
* `input_too_large` - Input Too Large
* `timeout` - Timeout
* `unknown` - Unknown

# components.schemas.FallbackLLM.properties.scope.description
Whether this fallback applies to a specific model or entire provider

* `model` - Model Specific
* `provider` - Provider Wide

# components.schemas.FallbackLLM.properties.source_provider.description
The provider whose models this fallback applies to

# components.schemas.FallbackLLM.properties.source_model.description
Specific model this fallback applies to (only for model scope)

# components.schemas.FallbackLLM.properties.tenant.description
Tenant this config applies to. Null means global.

# components.schemas.FallbackLLM.properties.is_enabled.description
Whether this fallback configuration is active

# components.schemas.FallbackLLMCreate.properties.scope.description
Whether this fallback applies to a specific model or entire provider

* `model` - Model Specific
* `provider` - Provider Wide

# components.schemas.FallbackLLMCreate.properties.tenant_key.description
Tenant key. Leave empty for global configuration.

# components.schemas.FallbackLLMCreate.properties.source_model_name.description
Source model name (required for model scope)

# components.schemas.FallbackLLMCreate.properties.is_enabled.description
Whether this fallback configuration is active

# components.schemas.FallbackLLMUpdate.properties.scope.description
Whether this fallback applies to a specific model or entire provider

* `model` - Model Specific
* `provider` - Provider Wide

# components.schemas.FallbackLLMUpdate.properties.source_provider.description
The provider whose models this fallback applies to

# components.schemas.FallbackLLMUpdate.properties.source_model.description
Specific model this fallback applies to (only for model scope)

# components.schemas.FallbackLLMUpdate.properties.is_enabled.description
Whether this fallback configuration is active

# components.schemas.FeedbackModeEnum.description
* `overall` - overall
* `per_criteria` - per_criteria
* `both` - both

# components.schemas.FieldTypeEnum.description
* `text` - Text
* `number` - Number
* `date` - Date
* `boolean` - Boolean
* `select` - Select
* `multi_select` - Multi-select

# components.schemas.FileTypeEnum.description
* `script` - Script
* `reference` - Reference
* `asset` - Asset

# components.schemas.FileUploadURLRequest.description
Request serializer for generating presigned upload URL

# components.schemas.FileUploadURLResponse.description
Response serializer for presigned upload URL

# components.schemas.FileUploadURLResponse.properties.file_id.description
Unique identifier for the ChatFile record

# components.schemas.FileUploadURLResponse.properties.upload_method.description
HTTP method to use for upload (PUT or POST)

# components.schemas.FlowTypeEnum.description
* `payment_method_update` - Payment Method Update
* `subscription_update` - Subscription Update
* `subscription_cancel` - Subscription Cancel

# components.schemas.GCMDevice.properties.active.description
Inactive devices will not be sent notifications

# components.schemas.GCMDevice.properties.cloud_message_type.description
You should choose FCM, GCM is deprecated

* `FCM` - Firebase Cloud Message
* `GCM` - Google Cloud Message

# components.schemas.GCMDevice.properties.application_id.description
Opaque application identity, should be filled in for multiple key/certificate access

# components.schemas.GCPTenantLaunchRequest.properties.is_advertising.description
Advertising mode allows a platform to set custom usd balance to allocate for its members

# components.schemas.GenderEnum.description
* `male` - Male
* `female` - Female
* `non_binary` - Non-binary
* `prefer_not_to_say` - Prefer not to say
* `other` - Other

# components.schemas.GlobalCatalogSearchResponse.properties.results.description
List of content items matching the search criteria

# components.schemas.GlobalCatalogSearchResponse.properties.count.description
Total number of items matching the search criteria

# components.schemas.GooglePayAccountResponseStatusEnum.description
* `ACCOUNT_ACTIVE` - Account Active
* `ACCOUNT_PENDING` - Account Pending

# components.schemas.GradePostedNotifyModeEnum.description
* `every` - every
* `first_only` - first_only

# components.schemas.GraderCriterion.properties.name.description
Name for the criteria (accuracy, clarity, etc.)

# components.schemas.GraderCriterion.properties.criteria.description
The requirements to evaluate this criterion against.

# components.schemas.GraderCriterion.properties.points.description
Raw point value for this criterion (e.g. 6 for a 6-point criterion). Normalized against the sum of all criteria points at grading time.

# components.schemas.GradingModeEnum.description
* `submission` - Submission
* `conversation` - Conversation

# components.schemas.GrandfatheringStrategyEnum.description
* `free_forever` - Free Forever - Existing users get unlimited free access
* `require_subscription` - Require Subscription - All users must subscribe (no grandfathering)

# components.schemas.GrantMentorAccessRequest.description
Request serializer for granting LTI mentor access

# components.schemas.GreetingMethodEnum.description
* `proactive_prompt` - Proactive Prompt
* `proactive_response` - Proactive Response

# components.schemas.HumanSupportTicket.description
serializer interface intended for students/ non-admin users.
This limits students to only update the subject and description of a ticket.

# components.schemas.HumanSupportTicketStatusEnum.description
* `open` - Open
* `in_progress` - In Progress
* `closed` - Closed

# components.schemas.InstitutionTypeEnum.description
* `university` - University
* `college` - College
* `institute` - Institute
* `academy` - Academy
* `other` - Other

# components.schemas.IntegrationCredential.description
Used for POST / PATCH responses on the integration-credential endpoint.

``to_representation`` substitutes ``IntegrationCredential.masked_value``
for the raw ``value`` field, so sensitive fields (as flagged by the
linked v2 ``IntegrationCredentialSchema``) come out masked
(e.g. ``"sk-****"``). Admin-only — GET responses go through
``AdminIntegrationCredentialSerializer`` or
``StudentIntegrationCredentialSerializer`` instead, depending on caller
role.

# components.schemas.IntegrationCredential.properties.value.description
Returns non-sensitive fields only.
Safe to return to students.

# components.schemas.IntegrationCredentialSchemaV2.description
Returns raw v2 schema with is_sensitive metadata.
Admin-only endpoint - students don't need schema access.

# components.schemas.IntervalEnum.description
* `month` - Monthly
* `year` - Yearly
* `one_time` - One Time

# components.schemas.ItemAccessCheckResponse.description
Response for the generic item access check endpoint.

Mirrors :class:`PaymentCheckResult` but only exposes the fields
relevant to API consumers.

# components.schemas.ItemAccessCheckResponse.properties.item_type.description
Item type that was checked (e.g. 'mentor', 'workshop').

# components.schemas.ItemAccessCheckResponse.properties.reason.description
Machine-readable reason for the access decision (e.g. 'active', 'no_paywall', 'no_subscription').

# components.schemas.ItemAccessCheckResponse.properties.requires_payment.description
True if the user must pay to gain access.

# components.schemas.ItemAccessCheckResponse.properties.pricing_available.description
True if pricing tiers are available for purchase.

# components.schemas.ItemAccessCheckResponse.properties.pricing.description
Pricing details when access is denied (item name, tiers, amounts).

# components.schemas.ItemAccessCheckResponse.properties.subscription.description
Active subscription details when the user has access via subscription.

# components.schemas.ItemPaywallConfig.properties.item_type.description
Type of item being paywalled (e.g. mentor, course, program, or custom types)

# components.schemas.ItemPaywallConfig.properties.item_id.description
Identifier for the item (UUID for mentors, slug/key for others)

# components.schemas.ItemPaywallConfig.properties.item_metadata.description
Arbitrary metadata for the item (custom types only).

# components.schemas.ItemPaywallConfig.properties.is_enabled.description
Whether the paywall is enabled for this item

# components.schemas.ItemPaywallConfig.properties.description.description
Marketing description shown to customers at checkout. If blank, a default is generated from the item name.

# components.schemas.ItemPaywallConfig.properties.allow_free_tier.description
Whether to allow a free tier (bypasses checkout)

# components.schemas.ItemPaywallConfig.properties.stripe_product_id.description
Stripe Product ID for this item (on the connected account)

# components.schemas.ItemPaywallConfig.properties.trial_period_days.description
Number of days for free trial (0 = no trial)

# components.schemas.ItemPaywallConfig.properties.grandfathering_strategy.description
How to handle existing users when enabling the paywall

* `free_forever` - Free Forever - Existing users get unlimited free access
* `require_subscription` - Require Subscription - All users must subscribe (no grandfathering)

# components.schemas.ItemPaywallConfig.properties.on_successful_payment.description
URL to redirect users to after successful payment. If blank, default confirmation page(or mentor/product url) or the caller-supplied URL is used.

# components.schemas.ItemPaywallConfig.properties.paywall_enabled_at.description
When the paywall was first enabled (for grandfathering cutoff)

# components.schemas.ItemPrice.properties.name.description
Display name for this pricing tier (e.g., 'Basic', 'Premium')

# components.schemas.ItemPrice.properties.description.description
Description of what's included in this tier

# components.schemas.ItemPrice.properties.amount.description
Price amount in USD (e.g., 9.99 for $9.99, 0 for free)

# components.schemas.ItemPrice.properties.interval.description
Billing interval

* `month` - Monthly
* `year` - Yearly
* `one_time` - One Time

# components.schemas.ItemPrice.properties.stripe_price_id.description
Stripe Price ID (on the connected account)

# components.schemas.ItemPrice.properties.is_active.description
Whether this price is currently available for purchase

# components.schemas.ItemPrice.properties.remark.description
Optional label for this price tier (e.g., 'Most Popular', 'Best Value')

# components.schemas.ItemPriceCreate.properties.name.description
Display name for this pricing tier (e.g., 'Basic', 'Premium')

# components.schemas.ItemPriceCreate.properties.description.description
Description of what's included in this tier

# components.schemas.ItemPriceCreate.properties.interval.description
Billing interval

* `month` - Monthly
* `year` - Yearly
* `one_time` - One Time

# components.schemas.ItemPriceCreate.properties.is_active.description
Whether this price is currently available for purchase

# components.schemas.ItemPriceCreate.properties.remark.description
Optional label for this price tier (e.g., 'Most Popular', 'Best Value')

# components.schemas.ItemSubscription.properties.status.description
Current subscription status

* `active` - Active
* `free` - Free Tier
* `grandfathered` - Grandfathered
* `trialing` - Trialing
* `past_due` - Past Due
* `canceled` - Canceled
* `incomplete` - Incomplete

# components.schemas.ItemSubscription.properties.cancel_at_period_end.description
Whether subscription will cancel at period end

# components.schemas.ItemSubscription.properties.is_grandfathered.description
Whether this is a grandfathered pre-paywall user

# components.schemas.ItemSubscriptionList.properties.status.description
Current subscription status

* `active` - Active
* `free` - Free Tier
* `grandfathered` - Grandfathered
* `trialing` - Trialing
* `past_due` - Past Due
* `canceled` - Canceled
* `incomplete` - Incomplete

# components.schemas.ItemTypeCommission.description
Commission percentages keyed by item type.

# components.schemas.ItemTypeEnum.description
* `course` - Course
* `unit` - Unit
* `resource` - Resource
* `course_unit` - Course and Unit
* `course_resource` - Course and Resource
* `unit_resource` - Unit and Resource
* `all` - Course, Unit, and Resource

# components.schemas.JudgeRecord.description
Read shape for a `EvaluationTaskRecord` of type ``llm_judge``.

# components.schemas.LLMModelRegistryMinimal.description
Minimal serializer for LLMModelRegistry in fallback configs.

# components.schemas.LLMProviderMinimal.description
Minimal serializer for LLMProvider in fallback configs.

# components.schemas.LLMProviderMinimal.properties.name.description
Provider identifier (e.g., 'openai', 'google')

* `openai` - OpenAI
* `google` - Google
* `anthropic` - Anthropic
* `azure_openai` - Azure OpenAI
* `groq` - Groq
* `bedrock` - AWS Bedrock
* `perplexity` - Perplexity
* `nvidia` - NVIDIA
* `sagemaker` - AWS SageMaker
* `xai` - xAI
* `deepseek` - DeepSeek
* `fake` - Fake (Testing)

# components.schemas.LLMQuestion.description
Serializer for individual question data, including possible answers.

Attributes:
    question_id (str): Unique identifier for the question.
    text (str): The text of the question.
    difficulty_level (Optional[int]): An optional difficulty level for the question.
    options (list[AnswerSerializer]): List of possible answers for the question.

# components.schemas.LLMResponse.properties.disabled_models.description
List of disabled models. If empty, all models are enabled.

# components.schemas.LeadSource.properties.id.description
Server-assigned id. Stable across renames.

# components.schemas.LeadSource.properties.platform.description
Platform the LeadSource belongs to. Set automatically from your credentials; you cannot pass another Platform's id.

# components.schemas.LeadSource.properties.name.description
Display name shown to sales reps when categorizing a Deal.

# components.schemas.LeadSource.properties.code.description
Stable slug used in API payloads and reports. Unique per Platform; lowercase letters, digits, and hyphens.

# components.schemas.LeadSource.properties.metadata.description
Free-form JSON for Platform-defined attributes.

# components.schemas.LearnerAnalyticsResponse.description
Unified response serializer for learner analytics endpoint.

# components.schemas.LearnerAnalyticsResponse.properties.overtime.description
Time spent over time data (when overtime=true)

# components.schemas.LearnerAnalyticsResult.description
Unified serializer for learner analytics results - handles both cross-platform and platform-specific data.

# components.schemas.LearnerListItem.description
Serializer for individual learner in the list.

# components.schemas.LearnerListResponse.description
Serializer for learner list API response.

# components.schemas.LearnerMetrics.description
Serializer for learner metrics from UserPlatformSummary.

# components.schemas.LearnerSummary.description
Serializer for learner summary data across all platforms.

# components.schemas.LifecycleStageEnum.description
* `lead` - Lead
* `qualified` - Qualified
* `opportunity` - Opportunity
* `customer` - Customer
* `churned` - Churned

# components.schemas.LlmProviderEnum.description
* `openai` - Openai
* `google` - Google
* `azure_openai` - Azure Openai

# components.schemas.LtiLaunchGate.properties.allow_all_within_org.description
If True, a target_link_uri will work with any content within this org

# components.schemas.LtiMentor.properties.platform_key.description
Platform key the requesting user belongs to

# components.schemas.LtiMentorCourseXBlock.properties.target_link_uri.description
The LTI target_link_uri for this mentor xblock

# components.schemas.LtiTool.properties.issuer.description
This value will look someting like https://example.com. Value provided by Lti 1.3 Platform.

# components.schemas.LtiTool.properties.client_id.description
The client id provided by Lti 1.3 Platform

# components.schemas.LtiTool.properties.auth_login_url.description
The Platforms OIDC Login endpoint. Value provided by LTI 1.3 Platform.

# components.schemas.LtiTool.properties.auth_token_url.description
The Platforms OIDC Token endpoint. Value provided by LTI 1.3 Platform.

# components.schemas.LtiTool.properties.auth_audience.description
The platforms Oauth2 Audience (aud). Usually can be skipped.

# components.schemas.LtiTool.properties.key_set_url.description
The platforms JWKS endpoint. Value provided by LTI 1.3 Platform.

# components.schemas.LtiTool.properties.key_set.description
In case Platform's JWKS endpoint is not available, you can provide the JWKS here. Value provided by LTI 1.3 Platform.

# components.schemas.LtiTool.properties.deployment_ids.description
List of deployment ids. Example: ["1", "deployment-2"]. Value(s) provided by LTI 1.3 Platform.

# components.schemas.MCPServer.properties.credentials.description
Authorization credentials to authenticate to the MCP server. If provided, these take priority over any headers configured on the server. Token here must be the full authorization value. For example: `<scheme> <credentials>`

# components.schemas.MCPServer.properties.extra_headers.description
Headers to send to the MCP server. Useful for authentication,

# components.schemas.MCPServer.properties.is_featured.description
Featured mcp servers will be accessible to all other tenants.

# components.schemas.MCPServer.properties.auth_type.description
The type of authentication to use for the MCP server.

* `none` - None
* `token` - Token
* `oauth2` - Oauth2

# components.schemas.MCPServer.properties.auth_scope.description
Determines the required authentication granularity. 'platform' uses shared platform credentials, 'mentor' requires mentor-level credentials, and 'user' requires each user to authenticate individually.

* `platform` - Platform
* `mentor` - Mentor
* `user` - User

# components.schemas.MCPServer.properties.is_enabled.description
Whether the MCP server is enabled or not.

# components.schemas.MCPServerConnection.description
Serializer for managing `MCPServerConnection` records via the API.

The serializer enforces the business rules for combining scope, platform,
and authentication configuration while exposing a masked view of any stored
credentials.

# components.schemas.MCPServerConnection.properties.scope.description
Whether this connection is scoped to a user or shared across a platform.

* `user` - User
* `mentor` - Mentor
* `platform` - Platform

# components.schemas.MCPServerConnection.properties.authorization_scheme.description
Authorization scheme to prefix tokens with (e.g. 'Bearer').

# components.schemas.MCPServerConnection.properties.extra_headers.description
Additional headers to include when connecting to the MCP server.

# components.schemas.MCPServerConnectionScopeEnum.description
* `user` - User
* `mentor` - Mentor
* `platform` - Platform

# components.schemas.MCPServerTransportEnum.description
* `sse` - Sse
* `websocket` - Websocket
* `streamable_http` - Streamable Http

# components.schemas.MarkAllReadRequest.description
Serializer for the request to mark notifications as read.

# components.schemas.MarkAllReadRequest.properties.notification_ids.description
Optional list of notification IDs to mark as read. If not provided, all unread notifications will be marked as read.

# components.schemas.MarkAllReadResponse.description
Serializer for the response when marking all notifications as read.

# components.schemas.MarkAllReadResponse.properties.message.description
Status message after marking notifications as read

# components.schemas.MaskedIntegrationCredential.description
Used for POST / PATCH responses on the integration-credential endpoint.

``to_representation`` substitutes ``IntegrationCredential.masked_value``
for the raw ``value`` field, so sensitive fields (as flagged by the
linked v2 ``IntegrationCredentialSchema``) come out masked
(e.g. ``"sk-****"``). Admin-only — GET responses go through
``AdminIntegrationCredentialSerializer`` or
``StudentIntegrationCredentialSerializer`` instead, depending on caller
role.

# components.schemas.MaskedIntegrationCredential.properties.value.description
Returns non-sensitive fields only.
Safe to return to students.

# components.schemas.McpServerConfig.description
``McpServerSchema`` from ``src/config/zod-schema.ts``.

All fields are optional (``catchall(unknown)`` on the upstream side) so
callers can submit subsets.  Extra fields are allowed.

# components.schemas.McpServerConfigTransportEnum.description
* `sse` - sse
* `streamable-http` - streamable-http

# components.schemas.MediaResource.properties.media_type.description
Type of media

* `video` - Video
* `image` - Image
* `document` - Document
* `audio` - Audio
* `other` - Other

# components.schemas.MediaResource.properties.item_type.description
Type of item this media is associated with

* `course` - Course
* `unit` - Unit
* `resource` - Resource
* `course_unit` - Course and Unit
* `course_resource` - Course and Resource
* `unit_resource` - Unit and Resource
* `all` - Course, Unit, and Resource

# components.schemas.MediaResource.properties.platform.description
The platform this media resource belongs to

# components.schemas.MediaTypeEnum.description
* `video` - Video
* `image` - Image
* `document` - Document
* `audio` - Audio
* `other` - Other

# components.schemas.MemoryComponentDataKindEnum.description
* `KnowledgeGap` - KnowledgeGap
* `LessonsLearned` - LessonsLearned
* `HelpRequest` - HelpRequest

# components.schemas.Mentor.properties.enable_offline_mode.description
Allow this mentor to be used offline with local LLMs

# components.schemas.Mentor.properties.enable_prompt_caching.description
Enable prompt caching for Anthropic models to reduce latency and cost. This disabled RAG and other dynamic parts of system prompt such as memory, current datetime, etc. Use with caution

# components.schemas.Mentor.properties.enable_openai_assistant.description
(Deprecated) Set template mentor to openai-agent instead.

# components.schemas.Mentor.properties.enable_total_grounding.description
Whether to force mentor to only use information within the provided documents.

# components.schemas.Mentor.properties.enable_suggested_prompts.description
Whether to show suggested prompts for the mentor or not. Note: Suggested prompts are created by tenant admins.

# components.schemas.Mentor.properties.enable_guided_prompts.description
Whether to show suggested prompts for the mentor or not. Note: Guided prompts are created with an llm based on chat history.

# components.schemas.Mentor.properties.guided_prompt_instructions.description
Instructions to determine how prompt suggestions are generated.

# components.schemas.Mentor.properties.voice_provider.description
TTS provider used when synthesizing chat messages from this mentor. Selects between openai_voice and google_voice.

* `browser` - Browser
* `openai` - OpenAI
* `google` - Google

# components.schemas.Mentor.properties.voice_instructions.description
Free-form instructions describing the desired voice and reading style (tone, pace, emotion, accent) for TTS synthesis. Passed to providers that support style prompts: OpenAI as the speech ``instructions`` and Google as the synthesis ``prompt``. Ignored by providers/voices that don't support styling.

# components.schemas.Mentor.properties.proactive_prompt.description
Prompt template used to start a conversation with the user when greeting_type is proactive_prompt. This will be sent to the LLM so it can respond naturally

# components.schemas.Mentor.properties.study_mode_prompt.description
Prompt to be used to guide the user through their studies when study mode tool is enabled.

# components.schemas.Mentor.properties.disclaimer.description
Disclaimer to be shown to the user when the mentor is used.

# components.schemas.Mentor.properties.starter_prompts.description
Type of starter prompts to show: guided_prompt or suggested_prompt.

* `guided_prompt` - Guided Prompt
* `suggested_prompt` - Suggested Prompt

# components.schemas.Mentor.properties.embed_is_context_aware.description
Allow embedded mentor to read content on the embedded web page.

# components.schemas.Mentor.properties.embed_show_voice_call.description
Show voice call button on embedded mentor.

# components.schemas.Mentor.properties.embed_show_voice_record.description
Show voice recording button on embedded mentor.

# components.schemas.Mentor.properties.embed_icon_selection_data.description
Stores embedded icon selection data for the mentor widget.

# components.schemas.Mentor.properties.placeholder_prompt.description
Placeholder to be shown in the input text area when the mentor is used.

# components.schemas.Mentor.properties.moderation_system_prompt.description
The prompt for the moderation system. This prompt must clearly distinguish between 'Approapriate' and 'Not Appropriate' queries.

# components.schemas.Mentor.properties.post_processing_prompt.description
Prompt to be used to alter or modify final llm response into any desired form.

# components.schemas.Mentor.properties.moderation_response.description
Desired feedback to return to the user when their prompt is deemed inappropriate.

# components.schemas.Mentor.properties.safety_system_prompt.description
Prompt to check whether the models response is appropriate or not.

# components.schemas.Mentor.properties.safety_response.description
Feedback given to the user when a model generates an inappropriate response

# components.schemas.Mentor.properties.enable_privacy_router.description
Enable PII detection and filtering before messages reach the LLM

# components.schemas.Mentor.properties.privacy_action.description
Action to take when PII is detected: redact replaces with labels, mask partially hides, block rejects the message, allow passes the message through unchanged while still logging the detection

* `redact` - Redact
* `mask` - Mask
* `block` - Block
* `allow` - Allow

# components.schemas.Mentor.properties.privacy_entities.description
List of PII entity types to detect. Empty list uses defaults (PERSON, EMAIL, PHONE, SSN, etc.)

# components.schemas.Mentor.properties.privacy_response.description
Response shown to user when a message is blocked due to PII detection

# components.schemas.Mentor.properties.enable_privacy_output_filter.description
Also filter PII from LLM responses (output rail)

# components.schemas.Mentor.properties.proactive_response.description
Response to start a conversation with a user.

# components.schemas.Mentor.properties.greeting_method.description
How the mentor should greet the user. proactive_prompt: Allow the LLM to respond to proactive_prompt msg. proactive_response: use proactive_response template without performing an LLM call.

* `proactive_prompt` - Proactive Prompt
* `proactive_response` - Proactive Response

# components.schemas.MentorAuditLogEntry.description
Serializer for a single audit log entry.

Transforms DMAuditLogEntry model instances into API response format.

# components.schemas.MentorAuditLogEntry.properties.actor_username.description
Username of the user who performed the action

# components.schemas.MentorAuditLogEntry.properties.actor_email.description
Email of the user who performed the action

# components.schemas.MentorAuditLogEntry.properties.resource_type.description
Type of resource modified (e.g., mentor, mentorsettings)

# components.schemas.MentorAuditLogEntry.properties.resource_repr.description
Human-readable representation of the resource

# components.schemas.MentorAuditLogEntry.properties.changes.description
Dictionary of field changes with old and new values

# components.schemas.MentorCategoryCreate.properties.audience.description
Deprecated: This is only left for backward compatibility. Please use the audiences field instead.

# components.schemas.MentorCategoryGroupCreate.properties.audience.description
Deprecated: This is only left for backward compatibility. Please use the audiences field instead.

# components.schemas.MentorCreate.properties.enable_offline_mode.description
Allow this mentor to be used offline with local LLMs

# components.schemas.MentorCreate.properties.enable_prompt_caching.description
Enable prompt caching for Anthropic models to reduce latency and cost. This disabled RAG and other dynamic parts of system prompt such as memory, current datetime, etc. Use with caution

# components.schemas.MentorCreate.properties.enable_openai_assistant.description
(Deprecated) Set template mentor to openai-agent instead.

# components.schemas.MentorCreate.properties.enable_total_grounding.description
Whether to force mentor to only use information within the provided documents.

# components.schemas.MentorCreate.properties.enable_suggested_prompts.description
Whether to show suggested prompts for the mentor or not. Note: Suggested prompts are created by tenant admins.

# components.schemas.MentorCreate.properties.enable_guided_prompts.description
Whether to show suggested prompts for the mentor or not. Note: Guided prompts are created with an llm based on chat history.

# components.schemas.MentorCreate.properties.voice_provider.description
TTS provider used when synthesizing chat messages from this mentor. Selects between openai_voice and google_voice.

* `browser` - Browser
* `openai` - OpenAI
* `google` - Google

# components.schemas.MentorCreate.properties.guided_prompt_instructions.description
Instructions to determine how prompt suggestions are generated.

# components.schemas.MentorCreate.properties.proactive_prompt.description
Prompt template used to start a conversation with the user when greeting_type is proactive_prompt. This will be sent to the LLM so it can respond naturally

# components.schemas.MentorCreate.properties.study_mode_prompt.description
Prompt to be used to guide the user through their studies when study mode tool is enabled.

# components.schemas.MentorCreate.properties.disclaimer.description
Disclaimer to be shown to the user when the mentor is used.

# components.schemas.MentorCreate.properties.starter_prompts.description
Type of starter prompts to show: guided_prompt or suggested_prompt.

* `guided_prompt` - Guided Prompt
* `suggested_prompt` - Suggested Prompt

# components.schemas.MentorCreate.properties.embed_is_context_aware.description
Allow embedded mentor to read content on the embedded web page.

# components.schemas.MentorCreate.properties.embed_show_voice_call.description
Show voice call button on embedded mentor.

# components.schemas.MentorCreate.properties.embed_show_voice_record.description
Show voice recording button on embedded mentor.

# components.schemas.MentorCreate.properties.embed_icon_selection_data.description
Stores embedded icon selection data for the mentor widget.

# components.schemas.MentorCreate.properties.placeholder_prompt.description
Placeholder to be shown in the input text area when the mentor is used.

# components.schemas.MentorCreate.properties.moderation_system_prompt.description
The prompt for the moderation system. This prompt must clearly distinguish between 'Approapriate' and 'Not Appropriate' queries.

# components.schemas.MentorCreate.properties.post_processing_prompt.description
Prompt to be used to alter or modify final llm response into any desired form.

# components.schemas.MentorCreate.properties.moderation_response.description
Desired feedback to return to the user when their prompt is deemed inappropriate.

# components.schemas.MentorCreate.properties.safety_system_prompt.description
Prompt to check whether the models response is appropriate or not.

# components.schemas.MentorCreate.properties.safety_response.description
Feedback given to the user when a model generates an inappropriate response

# components.schemas.MentorCreate.properties.strip_page_content_html.description
Per-mentor toggle for stripping HTML markup from `payload.page_content` before it is envelope-wrapped and cached for the LLM. Defaults to False (raw HTML reaches the prompt). Set to True to strip markup, e.g. when pages embed inline JSON/CSS in script/style tags that bloats the context window. Nullable so the add-column migration is a no-op for existing rows during a rolling multi-server deploy; a NULL value is treated as False at read time.

# components.schemas.MentorCreate.properties.enable_privacy_router.description
Enable PII detection and filtering before messages reach the LLM

# components.schemas.MentorCreate.properties.privacy_action.description
Action to take when PII is detected: redact replaces with labels, mask partially hides, block rejects the message, allow passes the message through unchanged while still logging the detection

* `redact` - Redact
* `mask` - Mask
* `block` - Block
* `allow` - Allow

# components.schemas.MentorCreate.properties.privacy_entities.description
List of PII entity types to detect. Empty list uses defaults (PERSON, EMAIL, PHONE, SSN, etc.)

# components.schemas.MentorCreate.properties.privacy_response.description
Response shown to user when a message is blocked due to PII detection

# components.schemas.MentorCreate.properties.enable_privacy_output_filter.description
Also filter PII from LLM responses (output rail)

# components.schemas.MentorCreate.properties.proactive_response.description
Response to start a conversation with a user.

# components.schemas.MentorCreate.properties.greeting_method.description
How the mentor should greet the user. proactive_prompt: Allow the LLM to respond to proactive_prompt msg. proactive_response: use proactive_response template without performing an LLM call.

* `proactive_prompt` - Proactive Prompt
* `proactive_response` - Proactive Response

# components.schemas.MentorGraderConfig.description
Config-only surface. Criteria are managed through the criteria
endpoints — keeping the two responsibilities separate.

# components.schemas.MentorGraderConfig.properties.grading_mode.description
Selects which grading tool the mentor exposes to the LLM. Only one tool is exposed per mode so the agent can't choose between them.

* `submission` - Submission
* `conversation` - Conversation

# components.schemas.MentorGraderConfig.properties.grader_instructions.description
Describe the problem that's being graded and any special instructions outside of the rubric. The grading LLM is already instructed to give a score of 0-1 for each rubric criterion which is multiplied by the criterion's points to give earned points; overall score is total earned points / total possible points.

# components.schemas.MentorPolicy.description
Serializer for mentor-specific RBAC policies using ModelSerializer pattern.
Accepts mentor_id and role, generates resources and role internally.

# components.schemas.MentorPolicy.properties.name.description
Policy name. If not supplied, defaults to a UUID4

# components.schemas.MentorPolicy.properties.role.description
Role for accessing this mentor

* `viewer` - viewer
* `editor` - editor
* `chat` - chat
* `analytics_viewer` - analytics_viewer
* `dataset_curator` - dataset_curator

# components.schemas.MentorPolicy.properties.resources.description
List of resources this policy applies to

# components.schemas.MentorPolicy.properties.groups_to_add.description
List of group IDs to grant access to this mentor

# components.schemas.MentorPolicy.properties.groups_to_remove.description
List of group IDs to revoke access from this mentor

# components.schemas.MentorPolicy.properties.users_to_add.description
List of user IDs to grant access to this mentor

# components.schemas.MentorPolicy.properties.usernames_to_add.description
List of usernames to grant access to this mentor

# components.schemas.MentorPolicy.properties.emails_to_add.description
List of user emails to grant access to this mentor

# components.schemas.MentorPolicy.properties.users_to_remove.description
List of user IDs to revoke access from this mentor

# components.schemas.MentorSearchResponse.properties.results.description
List of mentors matching the search criteria

# components.schemas.MentorSearchResponse.properties.count.description
Total number of mentors matching the search criteria

# components.schemas.MentorSettings.properties.is_lti_accessible.description
Enables LTI access for this mentor. When True, LTI users can be granted access via RBAC policies.

# components.schemas.MentorSettingsRequestPrivacyActionEnum.description
* `redact` - redact
* `mask` - mask
* `block` - block
* `allow` - allow

# components.schemas.MentorSettingsRequestVoiceProviderEnum.description
* `browser` - browser
* `openai` - openai
* `google` - google

# components.schemas.MentorVisibilityEnum.description
* `viewable_by_tenant_admins` - Viewable By Tenant Admins
* `viewable_by_tenant_students` - Viewable By Tenant Students
* `viewable_by_anyone` - Viewable By Anyone

# components.schemas.MetricDetail.description
Base serializer for detailed metric data.

# components.schemas.ModalityEnum.description
* `text` - Text
* `multimodal` - Multimodal
* `voice` - Voice

# components.schemas.NotificationCount.properties.status.description
Filter count by notification status

* `READ` - Read
* `UNREAD` - Unread
* `CANCELLED` - Cancelled

# components.schemas.NotificationFrequencyEnum.description
* `daily` - Daily
* `weekly` - Weekly
* `monthly` - Monthly
* `important_only` - Important only

# components.schemas.NotificationPreview.description
Request serializer for notification preview

# components.schemas.NotificationPreview.properties.template_data.description
Specify this to send a new custom message without using a predefined template

# components.schemas.NotificationPreview.properties.channels.description
Specify the channel ids to send notifications to.

# components.schemas.NotificationPreview.properties.sources.description
Specify the sources to send notifications to

# components.schemas.NotificationPreview.properties.context.description
Specify the context that would be available in the message text

# components.schemas.NotificationPreview.properties.process_on.description
(ISO datetime) Specify the date and time of processing this notification. Note, notifications are sent hourly and only scheduled messages prior to the beginning of the hour would be sent

# components.schemas.NotificationSource.description
Request serializer for source validation

# components.schemas.NotificationSourceTypeEnum.description
* `email` - email
* `username` - username
* `platform` - platform
* `csv` - csv
* `department` - department
* `pathway` - pathway
* `program` - program
* `usergroup` - usergroup

# components.schemas.NotificationTemplateData.properties.message_body.description
    This would be the body of the message. Some context are available to use in the system.

    e.g

    ```
    This is a sample message to {{username}}.

    Available accessors are 
    - site_name
    - site_url
    - site_logo_url
    - username
    and <anything passed into context dictionary>
    ```

    

# components.schemas.NotificationTemplateDetail.description
Serializer for detailed template view and editing

# components.schemas.NotificationTemplateDetail.properties.id.description
Unique identifier for this notification template.

# components.schemas.NotificationTemplateDetail.properties.type.description
Select the type of notification from the available options.

* `ACTIVITY_COURSE_MILESTONE` - Activity Course Milestone
* `ACTIVITY_NEW_CONTENT` - Activity New Content
* `ADMIN_NOTIF_COURSE_ENROLLMENT` - Admin Notif Course Enrollment
* `APP_REGISTRATION` - App Registration
* `COURSE_INVITATION` - Course Invitation
* `COURSE_LICENSE_ASSIGNMENT` - Course License Assignment
* `COURSE_LICENSE_GROUP_ASSIGNMENT` - Course License Group Assignment
* `COURSE_SCHEDULE_CHANGE` - Course Schedule Change
* `COURSES_PROGRESS_SUMMARY` - Courses Progress Summary
* `CRM_DEAL_STAGE_CHANGED` - Crm Deal Stage Changed
* `CRM_PERSON_CREATED` - Crm Person Created
* `CRM_PERSON_LINKED_TO_USER` - Crm Person Linked To User
* `CUSTOM_NOTIFICATION` - Custom Notification
* `DEFAULT_TEMPLATE` - Default Template
* `HUMAN_SUPPORT_NOTIFICATION` - Human Support Notification
* `PATHWAY_ENROLLMENT_CONFIRMATION` - Pathway Enrollment Confirmation
* `PLATFORM_INVITATION` - Platform Invitation
* `POLICY_ASSIGNMENT` - Policy Assignment
* `PROACTIVE_LEARNER_NOTIFICATION` - Proactive Learner Notification
* `PROGRAM_ENROLLMENT_CONFIRMATION` - Program Enrollment Confirmation
* `PROGRAM_INVITATION` - Program Invitation
* `PROGRAM_LICENSE_ASSIGNMENT` - Program License Assignment
* `PROGRAM_LICENSE_GROUP_ASSIGNMENT` - Program License Group Assignment
* `REPORT_COMPLETED` - Report Completed
* `ROLE_CHANGE` - Role Change
* `SKILL_MASTERY_CHANGE` - Skill Mastery Change
* `SUBSECTION_GRADE_UPDATE` - Subsection Grade Update
* `USER_LICENSE_ASSIGNMENT` - User License Assignment
* `USER_LICENSE_GROUP_ASSIGNMENT` - User License Group Assignment
* `USER_NOTIF_COURSE_COMPLETION` - User Notif Course Completion
* `USER_NOTIF_COURSE_ENROLLMENT` - User Notif Course Enrollment
* `USER_NOTIF_CREDENTIALS` - User Notif Credentials
* `USER_NOTIF_LEARNER_PROGRESS` - User Notif Learner Progress
* `USER_NOTIF_USER_INACTIVITY` - User Notif User Inactivity
* `USER_NOTIF_USER_REGISTRATION` - User Notif User Registration

# components.schemas.NotificationTemplateDetail.properties.description.description
Description of when this notification is sent

# components.schemas.NotificationTemplateDetail.properties.message_body.description
Body text (supports Django template syntax)

# components.schemas.NotificationTemplateDetail.properties.email_subject.description
Email subject line (supports {{ variables }})

# components.schemas.NotificationTemplateDetail.properties.email_html_template.description
HTML email body (supports Django template syntax)

# components.schemas.NotificationTemplateDetail.properties.tags.description
Free-form tags for categorization (e.g. ['activity', 'learning'])

# components.schemas.NotificationTemplateDetail.properties.channel_ids.description
IDs of delivery channels (email, push, etc.)

# components.schemas.NotificationTemplateDetail.properties.is_inherited.description
True if using main platform template (no platform override)

# components.schemas.NotificationTemplateDetail.properties.is_enabled.description
True if notification is enabled for this platform

# components.schemas.NotificationTemplateDetail.properties.can_customize.description
True if platform admin can edit template content

# components.schemas.NotificationTemplateDetail.properties.available_context.description
Context variables available for template rendering

# components.schemas.NotificationTemplateDetail.properties.proactive_prompt_message.description
Default prompt message for AI mentor notifications

# components.schemas.NotificationTemplateDetail.properties.periodic_learner_scope.description
Which learners to include: ACTIVE_LEARNERS or ALL_LEARNERS

* `ACTIVE_LEARNERS` - ACTIVE_LEARNERS
* `ALL_LEARNERS` - ALL_LEARNERS

# components.schemas.NotificationTemplateDetail.properties.periodic_lookback_days.description
Number of days to include in the report period

# components.schemas.NotificationTemplateDetail.properties.periodic_frequency.description
How often to send: DAILY, WEEKLY, MONTHLY, or CUSTOM

* `DAILY` - DAILY
* `WEEKLY` - WEEKLY
* `MONTHLY` - MONTHLY
* `CUSTOM` - CUSTOM

# components.schemas.NotificationTemplateDetail.properties.periodic_custom_interval_days.description
Custom interval in days (when frequency is CUSTOM)

# components.schemas.NotificationTemplateDetail.properties.periodic_timezone.description
Timezone for execution time (e.g. America/New_York)

# components.schemas.NotificationTemplateDetail.properties.periodic_mentors.description
List of mentor configurations: [{"unique_id": "uuid", "prompt": "...", "name": "..."}]

# components.schemas.NotificationTemplateDetail.properties.policy_enabled_policies.description
Per-role config: [{"role_name": "Analytics Viewer", "enabled": True, "subject": "Custom subject for {{role_name}}"}, ...]

# components.schemas.NotificationTemplateDetail.properties.policy_notify_on_assignment.description
Send notification when policy is assigned

# components.schemas.NotificationTemplateDetail.properties.policy_notify_on_removal.description
Send notification when policy is removed

# components.schemas.NotificationTemplateDetail.properties.human_support_recipient_mode.description
Who receives human support ticket notifications

* `platform_admins_and_mentor_owner` - platform_admins_and_mentor_owner
* `platform_admins_only` - platform_admins_only
* `mentor_owner_only` - mentor_owner_only
* `custom` - custom

# components.schemas.NotificationTemplateDetail.properties.human_support_custom_recipients.description
Custom targets: user: {type, id}; user_group: {type, id}; rbac_policy: {type, policy_name}

# components.schemas.NotificationTemplateDetail.properties.recipients_config.description
Recipients config (recipient mode + optional custom targets) for notification types that opt into the generic recipients model (e.g. CRM_*). Null for types that do not.

# components.schemas.NotificationTemplateDetail.properties.recipients_recipient_mode.description
Who receives this notification: 'platform_admins_only', 'object_owner_only' (falls back to admins), 'object_owner_only_strict' (no fallback), 'platform_admins_and_object_owner' (default), or 'custom'.

* `platform_admins_only` - platform_admins_only
* `object_owner_only` - object_owner_only
* `object_owner_only_strict` - object_owner_only_strict
* `platform_admins_and_object_owner` - platform_admins_and_object_owner
* `custom` - custom

# components.schemas.NotificationTemplateDetail.properties.recipients_custom_recipients.description
Custom recipient targets (used when recipient_mode='custom'): user: {type, id}; user_group: {type, id}; rbac_policy: {type, policy_name}.

# components.schemas.NotificationTemplateDetail.properties.new_content_config.description
New content notification config (ACTIVITY_NEW_CONTENT only)

# components.schemas.NotificationTemplateDetail.properties.new_content_block_types.description
Block types to notify on (e.g. ["sequential", "vertical", "chapter"])

# components.schemas.NotificationTemplateDetail.properties.course_milestone_milestones.description
Completion percentage thresholds (e.g. [25, 50, 75, 100])

# components.schemas.NotificationTemplateDetail.properties.skill_mastery_thresholds.description
Mastery band thresholds (e.g. [{"name": "Beginner", "min_points": 0}, {"name": "Intermediate", "min_points": 100}])

# components.schemas.NotificationTemplateDetail.properties.courses_progress_lookback_days.description
Lookback period in days for courses progress summary

# components.schemas.NotificationTemplateDetail.properties.courses_progress_frequency.description
How often to send courses progress summary

* `DAILY` - DAILY
* `WEEKLY` - WEEKLY
* `MONTHLY` - MONTHLY
* `CUSTOM` - CUSTOM

# components.schemas.NotificationTemplateDetail.properties.courses_progress_custom_interval_days.description
Custom interval in days (when frequency is CUSTOM)

# components.schemas.NotificationTemplateDetail.properties.courses_progress_timezone.description
Timezone for execution (e.g. America/New_York)

# components.schemas.NotificationTemplateDetail.properties.grade_posted_notify_mode.description
Notification mode: 'every' (with debounce) or 'first_only' (once per subsection)

* `every` - every
* `first_only` - first_only

# components.schemas.NotificationTemplateDetail.properties.grade_posted_debounce_seconds.description
Debounce window in seconds for 'every' mode (default 300)

# components.schemas.NotificationTemplateDetail.properties.created_at.description
Timestamp when this template was created

# components.schemas.NotificationTemplateDetail.properties.updated_at.description
Timestamp when this template was last updated

# components.schemas.NotificationTemplateList.description
Serializer for listing notification templates with inheritance info

# components.schemas.NotificationTemplateList.properties.id.description
Unique identifier for this notification template.

# components.schemas.NotificationTemplateList.properties.type.description
Select the type of notification from the available options.

* `ACTIVITY_COURSE_MILESTONE` - Activity Course Milestone
* `ACTIVITY_NEW_CONTENT` - Activity New Content
* `ADMIN_NOTIF_COURSE_ENROLLMENT` - Admin Notif Course Enrollment
* `APP_REGISTRATION` - App Registration
* `COURSE_INVITATION` - Course Invitation
* `COURSE_LICENSE_ASSIGNMENT` - Course License Assignment
* `COURSE_LICENSE_GROUP_ASSIGNMENT` - Course License Group Assignment
* `COURSE_SCHEDULE_CHANGE` - Course Schedule Change
* `COURSES_PROGRESS_SUMMARY` - Courses Progress Summary
* `CRM_DEAL_STAGE_CHANGED` - Crm Deal Stage Changed
* `CRM_PERSON_CREATED` - Crm Person Created
* `CRM_PERSON_LINKED_TO_USER` - Crm Person Linked To User
* `CUSTOM_NOTIFICATION` - Custom Notification
* `DEFAULT_TEMPLATE` - Default Template
* `HUMAN_SUPPORT_NOTIFICATION` - Human Support Notification
* `PATHWAY_ENROLLMENT_CONFIRMATION` - Pathway Enrollment Confirmation
* `PLATFORM_INVITATION` - Platform Invitation
* `POLICY_ASSIGNMENT` - Policy Assignment
* `PROACTIVE_LEARNER_NOTIFICATION` - Proactive Learner Notification
* `PROGRAM_ENROLLMENT_CONFIRMATION` - Program Enrollment Confirmation
* `PROGRAM_INVITATION` - Program Invitation
* `PROGRAM_LICENSE_ASSIGNMENT` - Program License Assignment
* `PROGRAM_LICENSE_GROUP_ASSIGNMENT` - Program License Group Assignment
* `REPORT_COMPLETED` - Report Completed
* `ROLE_CHANGE` - Role Change
* `SKILL_MASTERY_CHANGE` - Skill Mastery Change
* `SUBSECTION_GRADE_UPDATE` - Subsection Grade Update
* `USER_LICENSE_ASSIGNMENT` - User License Assignment
* `USER_LICENSE_GROUP_ASSIGNMENT` - User License Group Assignment
* `USER_NOTIF_COURSE_COMPLETION` - User Notif Course Completion
* `USER_NOTIF_COURSE_ENROLLMENT` - User Notif Course Enrollment
* `USER_NOTIF_CREDENTIALS` - User Notif Credentials
* `USER_NOTIF_LEARNER_PROGRESS` - User Notif Learner Progress
* `USER_NOTIF_USER_INACTIVITY` - User Notif User Inactivity
* `USER_NOTIF_USER_REGISTRATION` - User Notif User Registration

# components.schemas.NotificationTemplateList.properties.name.description
A friendly name for the notification template.

# components.schemas.NotificationTemplateList.properties.description.description
Admin-friendly description of what this notification does, when it triggers, and what data it needs

# components.schemas.NotificationTemplateList.properties.is_inherited.description
True if using main platform template (no platform override)

# components.schemas.NotificationTemplateList.properties.source_platform.description
Platform key of the template source (main or tenant)

# components.schemas.NotificationTemplateList.properties.is_enabled.description
True if notification is enabled for this platform

# components.schemas.NotificationTemplateList.properties.can_customize.description
True if platform admin can edit template content

# components.schemas.NotificationTemplateList.properties.is_custom.description
True if this is a custom notification type

# components.schemas.NotificationTemplateList.properties.email_subject.description
Email subject line (supports Django template syntax)

# components.schemas.NotificationTemplateList.properties.tags.description
Free-form tags for categorization (e.g. ['activity', 'learning'])

# components.schemas.NotificationTemplateList.properties.spas.description
SPAs (Single Page Apps) that can use this template

# components.schemas.NotificationTemplateList.properties.allowed_channels.description
Channels this template can be delivered via (email, push, etc.)

# components.schemas.NotificationTemplateList.properties.available_context.description
Context variables available for template rendering

# components.schemas.NotificationTemplateTest.description
Serializer for testing notification template

# components.schemas.NotificationTemplateTest.properties.context.description
Optional context variables for template rendering (e.g., {'course_name': 'Test Course'})

# components.schemas.NotificationTemplateTest.properties.use_sample_context.description
Use realistic sample data for this notification type. Set False for minimal context.

# components.schemas.NotificationTemplateTestResponse.description
Serializer for test notification response

# components.schemas.NotificationTemplateTestResponse.properties.success.description
Whether the test email was sent successfully

# components.schemas.NotificationToggle.description
Serializer for toggling notification preference

# components.schemas.NotificationToggle.properties.allow_notification.description
True to enable, False to disable this notification type for the platform

# components.schemas.NotificationTypePreference.description
Serializer for per-type notification preference updates.

# components.schemas.NotificationTypePreference.properties.enabled.description
Whether this notification type is enabled

# components.schemas.NotificationsUpdate.properties.notification_id.description
Comma-separated list of notification UUIDs to update

# components.schemas.NotificationsUpdate.properties.status.description
New status to set (e.g. read, unread)

* `READ` - Read
* `UNREAD` - Unread
* `CANCELLED` - Cancelled

# components.schemas.OAuthProvider.description
Read-only serializer for OAuth providers, including the services they expose.

# components.schemas.OAuthProvider.properties.use_basic_auth.description
Whether to use basic authentication for the OAuth provider. By default client id and client secret are sent to the Authorization server as post data.

# components.schemas.OAuthService.description
Read-only serializer exposing details about an OAuth service.

# components.schemas.OAuthService.properties.display_name.description
Human readable label for the OAuth service scope.

# components.schemas.OfflineDocument.description
Serializes documents for offline use.

Returns documents with S3 URLs that can be downloaded for offline use.

# components.schemas.Organization.description
Adds a read-only ``tags`` field to a host serializer.

Emits ``[{id, name, color}]``. Cheap when the host queryset uses
``prefetch_related("tag_assignments__tag")`` — without that prefetch
every record triggers two extra queries.

# components.schemas.Organization.properties.platform.description
Platform the Organization belongs to. Set server-side from the auth token.

# components.schemas.Organization.properties.name.description
Display name. Unique per platform (case-sensitive).

# components.schemas.Organization.properties.address.description
Free-form JSON address (street, city, country, etc.).

# components.schemas.Organization.properties.owner.description
Id of the Platform user who owns / manages this Organization. Must be an active member of your Platform.

# components.schemas.Organization.properties.metadata.description
Free-form JSON for Platform-defined attributes.

# components.schemas.OverTimeWithTotal.properties.data.description
Dates are keys and values are the value for the date in the key. e,g `{"2020-01-01": 30. ...}`

# components.schemas.OvertimeDataPoint.description
Serializer for individual overtime data points.

# components.schemas.OvertimeWithChangeInfo.properties.data.description
Dates are keys and values are the value for the date in the key. e,g `{"2020-01-01": 30. ...}`

# components.schemas.PaginatedAssertionsResponse.description
{
        'next': self.get_next_link(),
        'previous': self.get_previous_link(),
        'count': self.page.paginator.count,
        'data': data,
        'num_pages': self.page.paginator.num_pages,
        'page_number': self.page.number,
        'max_page_size': self.max_page_size
    }

# components.schemas.PaginatedCourseAccessRequest.description
Response serializer for paginated access request list

# components.schemas.PaginatedCourseGroupSuggestion.description
Response serializer for paginated course group suggestion list

# components.schemas.PaginatedCourseInvitation.description
Response serializer for paginated course invitation list

# components.schemas.PaginatedCourseLicense.description
Response serializer for paginated course license list

# components.schemas.PaginatedCourseLicenseAssignment.description
Response serializer for paginated course license assignment list

# components.schemas.PaginatedCourseLicenseGroupAssignment.description
Response serializer for paginated course license group assignment list

# components.schemas.PaginatedCourseLicenseGroupAssignment.properties.results.description
List of course license group assignments

# components.schemas.PaginatedCourseSuggestion.description
Response serializer for paginated course suggestion list

# components.schemas.PaginatedPathwayGroupSuggestion.description
Response serializer for paginated pathway group suggestion list

# components.schemas.PaginatedPathwaySuggestion.description
Response serializer for paginated pathway suggestion list

# components.schemas.PaginatedPlatformInvitation.description
Response serializer for paginated platform invitation list

# components.schemas.PaginatedPlatformLicense.description
Response serializer for paginated platform license list

# components.schemas.PaginatedProgramGroupSuggestion.description
Response serializer for paginated program group suggestion list

# components.schemas.PaginatedProgramInvitation.description
Response serializer for paginated program invitation list

# components.schemas.PaginatedProgramLicense.description
Response serializer for paginated program license list.

This serializer represents a paginated list of program licenses,
with navigation links and metadata.

Fields:
    count: Total number of results matching the query
    next: URL for the next page of results (null if no next page)
    previous: URL for the previous page of results (null if no previous page)
    results: List of program licenses

# components.schemas.PaginatedProgramLicenseAssignment.description
Response serializer for paginated program license assignment list.

This serializer represents a paginated list of program license assignments,
with navigation links and metadata.

Fields:
    count: Total number of results matching the query
    next: URL for the next page of results (null if no next page)
    previous: URL for the previous page of results (null if no previous page)
    results: List of program license assignments

# components.schemas.PaginatedProgramLicenseGroupAssignment.description
Response serializer for paginated program license group assignment list.

This serializer represents a paginated list of program license group assignments,
with navigation links and metadata.

Fields:
    count: Total number of results matching the query
    next: URL for the next page of results (null if no next page)
    previous: URL for the previous page of results (null if no previous page)
    results: List of program license group assignments

# components.schemas.PaginatedProgramLicenseGroupAssignment.properties.results.description
List of program license group assignments

# components.schemas.PaginatedProgramSuggestion.description
Response serializer for paginated program suggestion list

# components.schemas.PaginatedResource.description
OpenAPI schema wrapper for the paginated resources endpoint.

Mirrors the StandardPageNumberPagination response envelope so
drf-spectacular renders the correct schema. Not used at runtime
for serialization — the view uses ResourceSerializer for the items
and PaginationMixin builds the envelope.

# components.schemas.PaginatedUserLicense.description
Response serializer for paginated user license list

# components.schemas.PaginatedUserLicenseAssignment.description
Response serializer for paginated user license assignment list

# components.schemas.PaginatedUserLicenseGroupAssignment.description
Response serializer for paginated user license group assignment list

# components.schemas.PatchedActivity.properties.platform.description
Platform this Activity belongs to. Set automatically from your credentials; you cannot pass another Platform's id.

# components.schemas.PatchedActivity.properties.title.description
Short summary (e.g. 'Discovery call', 'Stage changed').

# components.schemas.PatchedActivity.properties.type.description
Interaction kind. One of `call`, `meeting`, `email`, `note`, `task`, `lunch`, `deadline`.

* `call` - Call
* `meeting` - Meeting
* `email` - Email
* `note` - Note
* `task` - Task
* `lunch` - Lunch
* `deadline` - Deadline

# components.schemas.PatchedActivity.properties.location.description
Meeting location / call dial-in / venue.

# components.schemas.PatchedActivity.properties.schedule_from.description
Scheduled start. Leave null for instant log entries.

# components.schemas.PatchedActivity.properties.is_done.description
Mark the Activity complete. Use `POST /activities/{id}/done/` to flip this and automatically stamp `done_at`.

# components.schemas.PatchedActivity.properties.done_at.description
Read-only. Set automatically the first time `is_done` flips True.

# components.schemas.PatchedActivity.properties.deal.description
Id of the Deal this Activity is logged against. Either `deal` or `person` is required.

# components.schemas.PatchedActivity.properties.person.description
UUID of the Person this Activity is logged against. Either `deal` or `person` is required.

# components.schemas.PatchedActivity.properties.owner.description
Id of the user who scheduled / logged this Activity. Defaults to the calling user on create.

# components.schemas.PatchedActivity.properties.reminder_sent.description
Marks that a reminder has been sent for this Activity; prevents the same reminder from firing twice.

# components.schemas.PatchedActivity.properties.metadata.description
Free-form JSON for Platform-defined attributes.

# components.schemas.PatchedAgentSkill.properties.category.description
Grouping for the catalog UI: web, code, browser, data, etc.

# components.schemas.PatchedAgentSkill.properties.is_featured.description
Featured skills on the 'main' platform are visible to all tenants.

# components.schemas.PatchedAgentSkill.properties.instruction.description
SKILL.md body — the agent runbook for this skill.

# components.schemas.PatchedAgentSkill.properties.metadata.description
SKILL.md frontmatter (requires, primaryEnv, emoji, etc.).

# components.schemas.PatchedAgentSkillResource.properties.content.description
Text content for script/reference resources.

# components.schemas.PatchedArtifact.description
Serializer for Artifact model.

Artifacts are structured content like essays, documents, code files, etc.
that are generated by AI agents during a chat session and are best
displayed separately from the normal chat flow.

Fields:
    - id: Unique identifier for the artifact
    - title: Title or identifier for the artifact
    - content: The markdown-styled content of the artifact
    - file_extension: The extension of the file (e.g., 'py', 'md', 'html', 'json', 'csv')
    - chat_message: Reference to the chat message that contains this artifact
    - llm_name: Name of the LLM that generated the artifact
    - llm_provider: Provider of the LLM (e.g., 'openai', 'google', 'anthropic')
    - date_created: Timestamp when the artifact was created
    - date_updated: Timestamp when the artifact was last updated
    - metadata: Additional metadata for the artifact
    - username: Username of the student who owns the artifact (read-only)
    - session_id: UUID of the session that generated the artifact (read-only)

Read-only fields:
    - id, date_created, date_updated, username, session_id

# components.schemas.PatchedArtifact.properties.file_extension.description
The extension of the file for the artifact. eg. `py`, `md`, `html`, `json`, `csv`, etc

# components.schemas.PatchedArtifact.properties.username.description
Username of the student who owns this artifact

# components.schemas.PatchedArtifact.properties.version_count.description
Total number of versions for this artifact

# components.schemas.PatchedCallConfiguration.properties.language.description
Language code for TTS, STT, and LLM (e.g., 'en', 'en-US', 'es', 'fr'). Defaults to 'en' (English).

# components.schemas.PatchedCallConfiguration.properties.use_function_calling_for_rag.description
Whether to use function calls in the agent or force RAG calls before LLM generation

# components.schemas.PatchedCallConfiguration.properties.enable_video.description
Whether to enable video for the call. (applicable only for realtime mode)

# components.schemas.PatchedCallConfiguration.properties.screensharing_system_prompt.description
System prompt to use for screensharing guidance. Defaults to VIDEO_GUIDANCE_PROMPT from constants.

# components.schemas.PatchedCallConfiguration.properties.screensharing_proactive_prompt.description
Proactive prompt used during screensharing calls to guide the conversation.

# components.schemas.PatchedClawConfigPatchRequest.description
Body for ``PATCH config/`` — wraps ``OpenClawClient.patch_config``.

The ``patch`` dict is deep-merged into the current config; ``null`` values
delete a key, arrays replace wholesale.  Echoing
``"__OPENCLAW_REDACTED__"`` back at a secret path is the documented way
to leave a secret unchanged.

# components.schemas.PatchedClawConfigPatchRequest.properties.patch.description
Merge-patch object applied to the current openclaw.json. Nulls delete keys; arrays replace wholesale; objects merge recursively.

# components.schemas.PatchedClawInstance.properties.provision_mode.description
Managed = provisioned by us. Self-hosted = tenant provides the server.

* `managed` - Managed
* `self_hosted` - Self-hosted

# components.schemas.PatchedClawInstance.properties.deployment_backend.description
Backend that deployed this server. Null = manually configured.

# components.schemas.PatchedClawInstance.properties.auth_headers.description
Per-server auth headers (overrides backend defaults).

# components.schemas.PatchedClawInstance.properties.connection_params.description
Variant-specific connection parameters (write-only in API). OpenClaw: device_identity.private_key_pem, timeouts. IronClaw: typically empty (bearer token covered by gateway_token).

# components.schemas.PatchedClawInstance.properties.last_pairing.description
The most recent device-pairing result (request id + fingerprint, or status), as written
by ``request_claw_pairing_task``. Read-only; transient (pairing requests expire ~5 min).

# components.schemas.PatchedClawMentorConfig.properties.agent_id.description
Worker-side agent id. System-minted from the mentor's unique_id on creation, immutable and read-only. Legacy configs may carry a hand-entered value such as 'main'.

# components.schemas.PatchedClawMentorConfig.properties.auto_push.description
When True, saving the mentor's AgentConfig should trigger an async config push. Signal/hook not yet wired — currently a flag for future use.

# components.schemas.PatchedClawMentorConfig.properties.last_push_warnings.description
Warnings from the last config push (baseline verification and per-agent skill upload).

# components.schemas.PatchedClawModelProvider.properties.name.description
Provider identifier in the Claw config (e.g. 'minimax')

# components.schemas.PatchedClawModelProvider.properties.credential_name.description
Name of the LLMCredential to resolve the API key from

# components.schemas.PatchedClawModelProvider.properties.credential_key.description
Key within the LLMCredential value JSON to extract the API key

# components.schemas.PatchedClawModelProvider.properties.model_catalog.description
List of {"id": "...", "name": "..."} entries for the provider model catalog

# components.schemas.PatchedClawModelProvider.properties.models_mode.description
'merge' adds to built-in models, 'replace' uses only configured providers.

# components.schemas.PatchedClawModelProvider.properties.credential_resolved.description
Check if the referenced LLMCredential exists for this platform.

# components.schemas.PatchedConversations.properties.lti_email.description
Email claim from LTI1.3 JWT if an LTI user and available

# components.schemas.PatchedConversations.properties.lti_username.description
Username claim from LTI1.3 JWT if an LTI user and available

# components.schemas.PatchedConversations.properties.is_authenticated.description
False if session was created by an anonymous user

# components.schemas.PatchedConversations.properties.disable_chathistory.description
Per-session override that skips writing ChatMessageHistory rows for this conversation. Honored only when the tenant has ALLOW_USER_CHAT_PRIVACY_CONTROL enabled. Mirrors Mentor.disable_chathistory but scoped to one session.

# components.schemas.PatchedConversations.properties.title.description
AI-generated title summarizing the conversation

# components.schemas.PatchedConversations.properties.is_conversation.description
True if the session has both user and AI messages

# components.schemas.PatchedCourseExportEligibility.description
Full CRUD serializer for course export eligibility records.

# components.schemas.PatchedCredentialRequest.properties.name.description
Name of the credential provider (e.g., 'openai', 'google-drive')

# components.schemas.PatchedCredentialRequest.properties.value.description
Credential data for the provider (API keys, service account details, etc.)

# components.schemas.PatchedCredentialRequest.properties.platform.description
Organization key identifier for the tenant

# components.schemas.PatchedCreditAccountAutoRechargeUpdate.description
Partial update for CreditAccount auto-recharge fields.

# components.schemas.PatchedCreditAccountAutoRechargeUpdate.properties.auto_recharge_threshold_usd.description
Set the balance threshold for auto-recharge (must be non-negative).

# components.schemas.PatchedCreditAccountAutoRechargeUpdate.properties.auto_recharge_spending_limit_usd.description
Cap on auto-recharge + manual top-up per 30-day period (user USD). 0 = unlimited. When > 0, backend sets recharge amount to 20% of limit (min $0.50).

# components.schemas.PatchedCreditAccountAutoRechargeUpdate.properties.platform_key.description
The platform key to update settings for (read-only in update context).

# components.schemas.PatchedCronJobPatch.description
Body for ``PATCH cron-jobs/<job_id>/`` — sent verbatim to
``cron.update`` as the ``patch`` parameter.  Every field is optional.

Field names are camelCase here to match the wire schema (``CronJobPatch``)
since the patch dict is forwarded directly without translation.

# components.schemas.PatchedDeal.description
Adds a read-only ``tags`` field to a host serializer.

Emits ``[{id, name, color}]``. Cheap when the host queryset uses
``prefetch_related("tag_assignments__tag")`` — without that prefetch
every record triggers two extra queries.

# components.schemas.PatchedDeal.properties.platform.description
Platform this Deal belongs to. Set automatically from your credentials; you cannot pass another Platform's id.

# components.schemas.PatchedDeal.properties.title.description
Short display name (e.g. 'Acme renewal — 2026').

# components.schemas.PatchedDeal.properties.description.description
Free-text notes about scope, requirements, etc.

# components.schemas.PatchedDeal.properties.status.description
Read-only. Set by the move-stage/won/lost actions and derived from the destination stage's `is_won`/`is_lost`. Direct writes are rejected with `400`; use `POST /deals/{id}/move-stage/` (or `won/` / `lost/`).

* `open` - Open
* `won` - Won
* `lost` - Lost

# components.schemas.PatchedDeal.properties.lost_reason.description
Set on a `lost` transition (e.g. 'Chose competitor').

# components.schemas.PatchedDeal.properties.expected_close_date.description
Forecasted close date — used by revenue projections.

# components.schemas.PatchedDeal.properties.closed_at.description
Read-only. Set automatically when the Deal enters a won/lost stage and cleared when it re-opens.

# components.schemas.PatchedDeal.properties.person.description
UUID of the primary contact for this Deal. The person must belong to your Platform.

# components.schemas.PatchedDeal.properties.organization.description
UUID of an organization the Deal is with. Optional; must belong to your Platform.

# components.schemas.PatchedDeal.properties.pipeline.description
Pipeline this Deal flows through. Must belong to your Platform.

# components.schemas.PatchedDeal.properties.stage.description
Current PipelineStage. On create, must belong to `pipeline`. Use `POST /deals/{id}/move-stage/` to change after creation.

# components.schemas.PatchedDeal.properties.source.description
Where the Deal originated. Optional; must belong to your Platform.

# components.schemas.PatchedDeal.properties.owner.description
Id of the platform user responsible for this Deal (sales rep). Defaults to the calling user on create.

# components.schemas.PatchedDeal.properties.metadata.description
Free-form JSON for Platform-defined attributes.

# components.schemas.PatchedDemographicsFieldDefinitionWrite.properties.name.description
Human-readable field label displayed in forms.

# components.schemas.PatchedDemographicsFieldDefinitionWrite.properties.slug.description
URL-safe identifier used as the key in custom_fields payloads.

# components.schemas.PatchedDemographicsFieldDefinitionWrite.properties.field_type.description
Data type for this field. One of: text, number, date, boolean, select, multi_select.

* `text` - Text
* `number` - Number
* `date` - Date
* `boolean` - Boolean
* `select` - Select
* `multi_select` - Multi-select

# components.schemas.PatchedDemographicsFieldDefinitionWrite.properties.required.description
Whether this field must be filled in by the user.

# components.schemas.PatchedDemographicsFieldDefinitionWrite.properties.choices.description
List of valid options for select/multi_select fields. Must be empty for other types.

# components.schemas.PatchedDemographicsFieldDefinitionWrite.properties.display_order.description
Sort order for rendering fields in the UI. Lower values appear first.

# components.schemas.PatchedDemographicsFieldDefinitionWrite.properties.active.description
Inactive fields are hidden from forms and excluded from responses.

# components.schemas.PatchedDemographicsFieldDefinitionWrite.properties.description.description
Optional description or instructions shown alongside the field.

# components.schemas.PatchedDisclaimer.properties.platform.description
Platform to which the disclaimer applies. 

# components.schemas.PatchedExportTargetEnvironment.description
Full CRUD serializer for target environments.

The bearer ``token`` field is write-only so credentials never leak via
GET responses. Model-level validation (oauth credentials OR token must
be provided) is enforced by calling ``ExportTargetEnvironment.clean()``
during ``validate()``.

# components.schemas.PatchedExportTargetEnvironment.properties.oauth_credentials.description
OAuth credentials for API authentication

# components.schemas.PatchedExportTargetEnvironment.properties.token.description
Manual bearer token (fallback if OAuth not configured)

# components.schemas.PatchedFallbackLLMUpdate.properties.scope.description
Whether this fallback applies to a specific model or entire provider

* `model` - Model Specific
* `provider` - Provider Wide

# components.schemas.PatchedFallbackLLMUpdate.properties.source_provider.description
The provider whose models this fallback applies to

# components.schemas.PatchedFallbackLLMUpdate.properties.source_model.description
Specific model this fallback applies to (only for model scope)

# components.schemas.PatchedFallbackLLMUpdate.properties.is_enabled.description
Whether this fallback configuration is active

# components.schemas.PatchedGraderCriterion.properties.name.description
Name for the criteria (accuracy, clarity, etc.)

# components.schemas.PatchedGraderCriterion.properties.criteria.description
The requirements to evaluate this criterion against.

# components.schemas.PatchedGraderCriterion.properties.points.description
Raw point value for this criterion (e.g. 6 for a 6-point criterion). Normalized against the sum of all criteria points at grading time.

# components.schemas.PatchedHumanSupportTicket.description
serializer interface intended for students/ non-admin users.
This limits students to only update the subject and description of a ticket.

# components.schemas.PatchedLeadSource.properties.id.description
Server-assigned id. Stable across renames.

# components.schemas.PatchedLeadSource.properties.platform.description
Platform the LeadSource belongs to. Set automatically from your credentials; you cannot pass another Platform's id.

# components.schemas.PatchedLeadSource.properties.name.description
Display name shown to sales reps when categorizing a Deal.

# components.schemas.PatchedLeadSource.properties.code.description
Stable slug used in API payloads and reports. Unique per Platform; lowercase letters, digits, and hyphens.

# components.schemas.PatchedLeadSource.properties.metadata.description
Free-form JSON for Platform-defined attributes.

# components.schemas.PatchedMCPServer.properties.credentials.description
Authorization credentials to authenticate to the MCP server. If provided, these take priority over any headers configured on the server. Token here must be the full authorization value. For example: `<scheme> <credentials>`

# components.schemas.PatchedMCPServer.properties.extra_headers.description
Headers to send to the MCP server. Useful for authentication,

# components.schemas.PatchedMCPServer.properties.is_featured.description
Featured mcp servers will be accessible to all other tenants.

# components.schemas.PatchedMCPServer.properties.auth_type.description
The type of authentication to use for the MCP server.

* `none` - None
* `token` - Token
* `oauth2` - Oauth2

# components.schemas.PatchedMCPServer.properties.auth_scope.description
Determines the required authentication granularity. 'platform' uses shared platform credentials, 'mentor' requires mentor-level credentials, and 'user' requires each user to authenticate individually.

* `platform` - Platform
* `mentor` - Mentor
* `user` - User

# components.schemas.PatchedMCPServer.properties.is_enabled.description
Whether the MCP server is enabled or not.

# components.schemas.PatchedMCPServerConnection.description
Serializer for managing `MCPServerConnection` records via the API.

The serializer enforces the business rules for combining scope, platform,
and authentication configuration while exposing a masked view of any stored
credentials.

# components.schemas.PatchedMCPServerConnection.properties.scope.description
Whether this connection is scoped to a user or shared across a platform.

* `user` - User
* `mentor` - Mentor
* `platform` - Platform

# components.schemas.PatchedMCPServerConnection.properties.authorization_scheme.description
Authorization scheme to prefix tokens with (e.g. 'Bearer').

# components.schemas.PatchedMCPServerConnection.properties.extra_headers.description
Additional headers to include when connecting to the MCP server.

# components.schemas.PatchedMediaResource.properties.media_type.description
Type of media

* `video` - Video
* `image` - Image
* `document` - Document
* `audio` - Audio
* `other` - Other

# components.schemas.PatchedMediaResource.properties.item_type.description
Type of item this media is associated with

* `course` - Course
* `unit` - Unit
* `resource` - Resource
* `course_unit` - Course and Unit
* `course_resource` - Course and Resource
* `unit_resource` - Unit and Resource
* `all` - Course, Unit, and Resource

# components.schemas.PatchedMediaResource.properties.platform.description
The platform this media resource belongs to

# components.schemas.PatchedMentorCategoryGroupCreate.properties.audience.description
Deprecated: This is only left for backward compatibility. Please use the audiences field instead.

# components.schemas.PatchedMentorCreate.properties.enable_offline_mode.description
Allow this mentor to be used offline with local LLMs

# components.schemas.PatchedMentorCreate.properties.enable_prompt_caching.description
Enable prompt caching for Anthropic models to reduce latency and cost. This disabled RAG and other dynamic parts of system prompt such as memory, current datetime, etc. Use with caution

# components.schemas.PatchedMentorCreate.properties.enable_openai_assistant.description
(Deprecated) Set template mentor to openai-agent instead.

# components.schemas.PatchedMentorCreate.properties.enable_total_grounding.description
Whether to force mentor to only use information within the provided documents.

# components.schemas.PatchedMentorCreate.properties.enable_suggested_prompts.description
Whether to show suggested prompts for the mentor or not. Note: Suggested prompts are created by tenant admins.

# components.schemas.PatchedMentorCreate.properties.enable_guided_prompts.description
Whether to show suggested prompts for the mentor or not. Note: Guided prompts are created with an llm based on chat history.

# components.schemas.PatchedMentorCreate.properties.voice_provider.description
TTS provider used when synthesizing chat messages from this mentor. Selects between openai_voice and google_voice.

* `browser` - Browser
* `openai` - OpenAI
* `google` - Google

# components.schemas.PatchedMentorCreate.properties.guided_prompt_instructions.description
Instructions to determine how prompt suggestions are generated.

# components.schemas.PatchedMentorCreate.properties.proactive_prompt.description
Prompt template used to start a conversation with the user when greeting_type is proactive_prompt. This will be sent to the LLM so it can respond naturally

# components.schemas.PatchedMentorCreate.properties.study_mode_prompt.description
Prompt to be used to guide the user through their studies when study mode tool is enabled.

# components.schemas.PatchedMentorCreate.properties.disclaimer.description
Disclaimer to be shown to the user when the mentor is used.

# components.schemas.PatchedMentorCreate.properties.starter_prompts.description
Type of starter prompts to show: guided_prompt or suggested_prompt.

* `guided_prompt` - Guided Prompt
* `suggested_prompt` - Suggested Prompt

# components.schemas.PatchedMentorCreate.properties.embed_is_context_aware.description
Allow embedded mentor to read content on the embedded web page.

# components.schemas.PatchedMentorCreate.properties.embed_show_voice_call.description
Show voice call button on embedded mentor.

# components.schemas.PatchedMentorCreate.properties.embed_show_voice_record.description
Show voice recording button on embedded mentor.

# components.schemas.PatchedMentorCreate.properties.embed_icon_selection_data.description
Stores embedded icon selection data for the mentor widget.

# components.schemas.PatchedMentorCreate.properties.placeholder_prompt.description
Placeholder to be shown in the input text area when the mentor is used.

# components.schemas.PatchedMentorCreate.properties.moderation_system_prompt.description
The prompt for the moderation system. This prompt must clearly distinguish between 'Approapriate' and 'Not Appropriate' queries.

# components.schemas.PatchedMentorCreate.properties.post_processing_prompt.description
Prompt to be used to alter or modify final llm response into any desired form.

# components.schemas.PatchedMentorCreate.properties.moderation_response.description
Desired feedback to return to the user when their prompt is deemed inappropriate.

# components.schemas.PatchedMentorCreate.properties.safety_system_prompt.description
Prompt to check whether the models response is appropriate or not.

# components.schemas.PatchedMentorCreate.properties.safety_response.description
Feedback given to the user when a model generates an inappropriate response

# components.schemas.PatchedMentorCreate.properties.strip_page_content_html.description
Per-mentor toggle for stripping HTML markup from `payload.page_content` before it is envelope-wrapped and cached for the LLM. Defaults to False (raw HTML reaches the prompt). Set to True to strip markup, e.g. when pages embed inline JSON/CSS in script/style tags that bloats the context window. Nullable so the add-column migration is a no-op for existing rows during a rolling multi-server deploy; a NULL value is treated as False at read time.

# components.schemas.PatchedMentorCreate.properties.enable_privacy_router.description
Enable PII detection and filtering before messages reach the LLM

# components.schemas.PatchedMentorCreate.properties.privacy_action.description
Action to take when PII is detected: redact replaces with labels, mask partially hides, block rejects the message, allow passes the message through unchanged while still logging the detection

* `redact` - Redact
* `mask` - Mask
* `block` - Block
* `allow` - Allow

# components.schemas.PatchedMentorCreate.properties.privacy_entities.description
List of PII entity types to detect. Empty list uses defaults (PERSON, EMAIL, PHONE, SSN, etc.)

# components.schemas.PatchedMentorCreate.properties.privacy_response.description
Response shown to user when a message is blocked due to PII detection

# components.schemas.PatchedMentorCreate.properties.enable_privacy_output_filter.description
Also filter PII from LLM responses (output rail)

# components.schemas.PatchedMentorCreate.properties.proactive_response.description
Response to start a conversation with a user.

# components.schemas.PatchedMentorCreate.properties.greeting_method.description
How the mentor should greet the user. proactive_prompt: Allow the LLM to respond to proactive_prompt msg. proactive_response: use proactive_response template without performing an LLM call.

* `proactive_prompt` - Proactive Prompt
* `proactive_response` - Proactive Response

# components.schemas.PatchedMentorGraderConfig.description
Config-only surface. Criteria are managed through the criteria
endpoints — keeping the two responsibilities separate.

# components.schemas.PatchedMentorGraderConfig.properties.grading_mode.description
Selects which grading tool the mentor exposes to the LLM. Only one tool is exposed per mode so the agent can't choose between them.

* `submission` - Submission
* `conversation` - Conversation

# components.schemas.PatchedMentorGraderConfig.properties.grader_instructions.description
Describe the problem that's being graded and any special instructions outside of the rubric. The grading LLM is already instructed to give a score of 0-1 for each rubric criterion which is multiplied by the criterion's points to give earned points; overall score is total earned points / total possible points.

# components.schemas.PatchedMentorSettings.properties.is_lti_accessible.description
Enables LTI access for this mentor. When True, LTI users can be granted access via RBAC policies.

# components.schemas.PatchedNotificationTemplateDetail.description
Serializer for detailed template view and editing

# components.schemas.PatchedNotificationTemplateDetail.properties.id.description
Unique identifier for this notification template.

# components.schemas.PatchedNotificationTemplateDetail.properties.type.description
Select the type of notification from the available options.

* `ACTIVITY_COURSE_MILESTONE` - Activity Course Milestone
* `ACTIVITY_NEW_CONTENT` - Activity New Content
* `ADMIN_NOTIF_COURSE_ENROLLMENT` - Admin Notif Course Enrollment
* `APP_REGISTRATION` - App Registration
* `COURSE_INVITATION` - Course Invitation
* `COURSE_LICENSE_ASSIGNMENT` - Course License Assignment
* `COURSE_LICENSE_GROUP_ASSIGNMENT` - Course License Group Assignment
* `COURSE_SCHEDULE_CHANGE` - Course Schedule Change
* `COURSES_PROGRESS_SUMMARY` - Courses Progress Summary
* `CRM_DEAL_STAGE_CHANGED` - Crm Deal Stage Changed
* `CRM_PERSON_CREATED` - Crm Person Created
* `CRM_PERSON_LINKED_TO_USER` - Crm Person Linked To User
* `CUSTOM_NOTIFICATION` - Custom Notification
* `DEFAULT_TEMPLATE` - Default Template
* `HUMAN_SUPPORT_NOTIFICATION` - Human Support Notification
* `PATHWAY_ENROLLMENT_CONFIRMATION` - Pathway Enrollment Confirmation
* `PLATFORM_INVITATION` - Platform Invitation
* `POLICY_ASSIGNMENT` - Policy Assignment
* `PROACTIVE_LEARNER_NOTIFICATION` - Proactive Learner Notification
* `PROGRAM_ENROLLMENT_CONFIRMATION` - Program Enrollment Confirmation
* `PROGRAM_INVITATION` - Program Invitation
* `PROGRAM_LICENSE_ASSIGNMENT` - Program License Assignment
* `PROGRAM_LICENSE_GROUP_ASSIGNMENT` - Program License Group Assignment
* `REPORT_COMPLETED` - Report Completed
* `ROLE_CHANGE` - Role Change
* `SKILL_MASTERY_CHANGE` - Skill Mastery Change
* `SUBSECTION_GRADE_UPDATE` - Subsection Grade Update
* `USER_LICENSE_ASSIGNMENT` - User License Assignment
* `USER_LICENSE_GROUP_ASSIGNMENT` - User License Group Assignment
* `USER_NOTIF_COURSE_COMPLETION` - User Notif Course Completion
* `USER_NOTIF_COURSE_ENROLLMENT` - User Notif Course Enrollment
* `USER_NOTIF_CREDENTIALS` - User Notif Credentials
* `USER_NOTIF_LEARNER_PROGRESS` - User Notif Learner Progress
* `USER_NOTIF_USER_INACTIVITY` - User Notif User Inactivity
* `USER_NOTIF_USER_REGISTRATION` - User Notif User Registration

# components.schemas.PatchedNotificationTemplateDetail.properties.description.description
Description of when this notification is sent

# components.schemas.PatchedNotificationTemplateDetail.properties.message_body.description
Body text (supports Django template syntax)

# components.schemas.PatchedNotificationTemplateDetail.properties.email_subject.description
Email subject line (supports {{ variables }})

# components.schemas.PatchedNotificationTemplateDetail.properties.email_html_template.description
HTML email body (supports Django template syntax)

# components.schemas.PatchedNotificationTemplateDetail.properties.tags.description
Free-form tags for categorization (e.g. ['activity', 'learning'])

# components.schemas.PatchedNotificationTemplateDetail.properties.channel_ids.description
IDs of delivery channels (email, push, etc.)

# components.schemas.PatchedNotificationTemplateDetail.properties.is_inherited.description
True if using main platform template (no platform override)

# components.schemas.PatchedNotificationTemplateDetail.properties.is_enabled.description
True if notification is enabled for this platform

# components.schemas.PatchedNotificationTemplateDetail.properties.can_customize.description
True if platform admin can edit template content

# components.schemas.PatchedNotificationTemplateDetail.properties.available_context.description
Context variables available for template rendering

# components.schemas.PatchedNotificationTemplateDetail.properties.proactive_prompt_message.description
Default prompt message for AI mentor notifications

# components.schemas.PatchedNotificationTemplateDetail.properties.periodic_learner_scope.description
Which learners to include: ACTIVE_LEARNERS or ALL_LEARNERS

* `ACTIVE_LEARNERS` - ACTIVE_LEARNERS
* `ALL_LEARNERS` - ALL_LEARNERS

# components.schemas.PatchedNotificationTemplateDetail.properties.periodic_lookback_days.description
Number of days to include in the report period

# components.schemas.PatchedNotificationTemplateDetail.properties.periodic_frequency.description
How often to send: DAILY, WEEKLY, MONTHLY, or CUSTOM

* `DAILY` - DAILY
* `WEEKLY` - WEEKLY
* `MONTHLY` - MONTHLY
* `CUSTOM` - CUSTOM

# components.schemas.PatchedNotificationTemplateDetail.properties.periodic_custom_interval_days.description
Custom interval in days (when frequency is CUSTOM)

# components.schemas.PatchedNotificationTemplateDetail.properties.periodic_timezone.description
Timezone for execution time (e.g. America/New_York)

# components.schemas.PatchedNotificationTemplateDetail.properties.periodic_mentors.description
List of mentor configurations: [{"unique_id": "uuid", "prompt": "...", "name": "..."}]

# components.schemas.PatchedNotificationTemplateDetail.properties.policy_enabled_policies.description
Per-role config: [{"role_name": "Analytics Viewer", "enabled": True, "subject": "Custom subject for {{role_name}}"}, ...]

# components.schemas.PatchedNotificationTemplateDetail.properties.policy_notify_on_assignment.description
Send notification when policy is assigned

# components.schemas.PatchedNotificationTemplateDetail.properties.policy_notify_on_removal.description
Send notification when policy is removed

# components.schemas.PatchedNotificationTemplateDetail.properties.human_support_recipient_mode.description
Who receives human support ticket notifications

* `platform_admins_and_mentor_owner` - platform_admins_and_mentor_owner
* `platform_admins_only` - platform_admins_only
* `mentor_owner_only` - mentor_owner_only
* `custom` - custom

# components.schemas.PatchedNotificationTemplateDetail.properties.human_support_custom_recipients.description
Custom targets: user: {type, id}; user_group: {type, id}; rbac_policy: {type, policy_name}

# components.schemas.PatchedNotificationTemplateDetail.properties.recipients_config.description
Recipients config (recipient mode + optional custom targets) for notification types that opt into the generic recipients model (e.g. CRM_*). Null for types that do not.

# components.schemas.PatchedNotificationTemplateDetail.properties.recipients_recipient_mode.description
Who receives this notification: 'platform_admins_only', 'object_owner_only' (falls back to admins), 'object_owner_only_strict' (no fallback), 'platform_admins_and_object_owner' (default), or 'custom'.

* `platform_admins_only` - platform_admins_only
* `object_owner_only` - object_owner_only
* `object_owner_only_strict` - object_owner_only_strict
* `platform_admins_and_object_owner` - platform_admins_and_object_owner
* `custom` - custom

# components.schemas.PatchedNotificationTemplateDetail.properties.recipients_custom_recipients.description
Custom recipient targets (used when recipient_mode='custom'): user: {type, id}; user_group: {type, id}; rbac_policy: {type, policy_name}.

# components.schemas.PatchedNotificationTemplateDetail.properties.new_content_config.description
New content notification config (ACTIVITY_NEW_CONTENT only)

# components.schemas.PatchedNotificationTemplateDetail.properties.new_content_block_types.description
Block types to notify on (e.g. ["sequential", "vertical", "chapter"])

# components.schemas.PatchedNotificationTemplateDetail.properties.course_milestone_milestones.description
Completion percentage thresholds (e.g. [25, 50, 75, 100])

# components.schemas.PatchedNotificationTemplateDetail.properties.skill_mastery_thresholds.description
Mastery band thresholds (e.g. [{"name": "Beginner", "min_points": 0}, {"name": "Intermediate", "min_points": 100}])

# components.schemas.PatchedNotificationTemplateDetail.properties.courses_progress_lookback_days.description
Lookback period in days for courses progress summary

# components.schemas.PatchedNotificationTemplateDetail.properties.courses_progress_frequency.description
How often to send courses progress summary

* `DAILY` - DAILY
* `WEEKLY` - WEEKLY
* `MONTHLY` - MONTHLY
* `CUSTOM` - CUSTOM

# components.schemas.PatchedNotificationTemplateDetail.properties.courses_progress_custom_interval_days.description
Custom interval in days (when frequency is CUSTOM)

# components.schemas.PatchedNotificationTemplateDetail.properties.courses_progress_timezone.description
Timezone for execution (e.g. America/New_York)

# components.schemas.PatchedNotificationTemplateDetail.properties.grade_posted_notify_mode.description
Notification mode: 'every' (with debounce) or 'first_only' (once per subsection)

* `every` - every
* `first_only` - first_only

# components.schemas.PatchedNotificationTemplateDetail.properties.grade_posted_debounce_seconds.description
Debounce window in seconds for 'every' mode (default 300)

# components.schemas.PatchedNotificationTemplateDetail.properties.created_at.description
Timestamp when this template was created

# components.schemas.PatchedNotificationTemplateDetail.properties.updated_at.description
Timestamp when this template was last updated

# components.schemas.PatchedNotificationToggle.description
Serializer for toggling notification preference

# components.schemas.PatchedNotificationToggle.properties.allow_notification.description
True to enable, False to disable this notification type for the platform

# components.schemas.PatchedNotificationTypePreference.description
Serializer for per-type notification preference updates.

# components.schemas.PatchedNotificationTypePreference.properties.enabled.description
Whether this notification type is enabled

# components.schemas.PatchedOrganization.description
Adds a read-only ``tags`` field to a host serializer.

Emits ``[{id, name, color}]``. Cheap when the host queryset uses
``prefetch_related("tag_assignments__tag")`` — without that prefetch
every record triggers two extra queries.

# components.schemas.PatchedOrganization.properties.platform.description
Platform the Organization belongs to. Set server-side from the auth token.

# components.schemas.PatchedOrganization.properties.name.description
Display name. Unique per platform (case-sensitive).

# components.schemas.PatchedOrganization.properties.address.description
Free-form JSON address (street, city, country, etc.).

# components.schemas.PatchedOrganization.properties.owner.description
Id of the Platform user who owns / manages this Organization. Must be an active member of your Platform.

# components.schemas.PatchedOrganization.properties.metadata.description
Free-form JSON for Platform-defined attributes.

# components.schemas.PatchedPeriodicAgentCreate.properties.previous_agent.description
Agent that needs to run before the current agent runs.

# components.schemas.PatchedPeriodicAgentCreate.properties.previous_agent_status.description
The status that the previous agent must be in before this agent gets scheduled.

* `success` - Success
* `error` - Error
* `running` - Running
* `pending` - Pending

# components.schemas.PatchedPeriodicAgentCreate.properties.previous_agent_output.description
This will be fed into the run of this agent as part of its input prompt.

# components.schemas.PatchedPerson.description
Adds a read-only ``tags`` field to a host serializer.

Emits ``[{id, name, color}]``. Cheap when the host queryset uses
``prefetch_related("tag_assignments__tag")`` — without that prefetch
every record triggers two extra queries.

# components.schemas.PatchedPerson.properties.id.description
Server-assigned UUID. Stable across renames and merges.

# components.schemas.PatchedPerson.properties.platform.description
Platform the person belongs to. Set automatically from your credentials; you cannot pass another Platform's id.

# components.schemas.PatchedPerson.properties.primary_email.description
Canonical email address. When a platform user is created with a matching email in your Platform, this person is automatically linked to them (case-insensitive).

# components.schemas.PatchedPerson.properties.emails.description
Additional email addresses associated with this person.

# components.schemas.PatchedPerson.properties.contact_numbers.description
Phone/contact numbers in any free-form shape.

# components.schemas.PatchedPerson.properties.job_title.description
Role / job title — display only, not validated.

# components.schemas.PatchedPerson.properties.organization.description
UUID of an organization in your Platform. References to organizations in other Platforms are rejected.

# components.schemas.PatchedPerson.properties.owner.description
Id of the platform user who owns / manages this person (internal account manager). Optional.

# components.schemas.PatchedPerson.properties.platform_user.description
Read-only. Populated once this person is bound to a platform user — either automatically on user creation when emails match, or explicitly via `POST /persons/{id}/link-user/`.

# components.schemas.PatchedPerson.properties.lifecycle_stage.description
Sales pipeline stage. One of: `lead`, `qualified`, `opportunity`, `customer`, `churned`.

* `lead` - Lead
* `qualified` - Qualified
* `opportunity` - Opportunity
* `customer` - Customer
* `churned` - Churned

# components.schemas.PatchedPerson.properties.unique_id.description
Optional external system id (e.g. import key from another CRM). When non-blank, must be unique within your Platform.

# components.schemas.PatchedPerson.properties.active.description
Read-only. Set to `false` when the person is linked to a platform user or merged into another person.

# components.schemas.PatchedPerson.properties.metadata.description
Free-form JSON for Platform-defined attributes.

# components.schemas.PatchedPipeline.properties.platform.description
Platform this Pipeline belongs to. Set automatically from your credentials; you cannot pass another Platform's id.

# components.schemas.PatchedPipeline.properties.name.description
Display name (e.g. 'B2B Sales', 'Renewals').

# components.schemas.PatchedPipeline.properties.code.description
Stable slug used in API payloads. Unique per Platform; lowercase letters, digits, and hyphens.

# components.schemas.PatchedPipeline.properties.is_default.description
Mark this as the default Pipeline new Deals land in when none is specified. At most one default per Platform — promoting a new default requires un-flagging the old one in the same call set.

# components.schemas.PatchedPipeline.properties.rotten_days.description
Days a Deal can sit in a stage before it's surfaced as stale.

# components.schemas.PatchedPipeline.properties.metadata.description
Free-form JSON for Platform-defined attributes.

# components.schemas.PatchedPipelineStage.properties.pipeline.description
Pipeline this stage belongs to. Set automatically from the URL path; you cannot move a stage between Pipelines.

# components.schemas.PatchedPipelineStage.properties.code.description
Stable identifier referenced by `Deal.stage` payloads. Unique within the Pipeline.

# components.schemas.PatchedPipelineStage.properties.probability.description
Win likelihood at this stage (0–100). Used for revenue forecasting.

# components.schemas.PatchedPipelineStage.properties.sort_order.description
Left-to-right position on the Kanban board.

# components.schemas.PatchedPipelineStage.properties.is_won.description
Closed-won terminal stage. Moving a Deal here sets `Deal.status='won'`.

# components.schemas.PatchedPipelineStage.properties.is_lost.description
Closed-lost terminal stage. Moving a Deal here sets `Deal.status='lost'`.

# components.schemas.PatchedPipelineStage.properties.metadata.description
Free-form JSON for Platform-defined attributes.

# components.schemas.PatchedPlatformApiKey.properties.name.description
Name of the token. Used by the user to identify the token.

# components.schemas.PatchedPlatformApiKey.properties.expires_in.description
Optional duration until key expires. Format: [DD] [HH:[MM:]]ss[.uuuuuu]

# components.schemas.PatchedPlatformApiKey.properties.mode.description
How permissions resolve: 'owner' (default) uses the owner's RBAC permissions; 'token_policies' uses the policies/groups this token is associated with

* `owner` - Owner permissions
* `token_policies` - Token policies

# components.schemas.PatchedPlatformApiKey.properties.policies_to_add.description
RbacPolicy IDs to associate with this token (mode=token_policies)

# components.schemas.PatchedPlatformApiKey.properties.policies_to_remove.description
RbacPolicy IDs to disassociate from this token (mode=token_policies)

# components.schemas.PatchedPlatformApiKey.properties.groups_to_add.description
RbacGroup IDs to associate with this token (mode=token_policies)

# components.schemas.PatchedPlatformApiKey.properties.groups_to_remove.description
RbacGroup IDs to disassociate from this token (mode=token_policies)

# components.schemas.PatchedProject.description
Unified serializer for Project model.

Write-only fields:
- mentors_to_add: List of mentor unique IDs to add to the project
- mentors_to_remove: List of mentor unique IDs to remove from the project

These fields are mutually exclusive and only used during create/update operations.
For create: only mentors_to_add is used
For update: either can be used, but not both at once

# components.schemas.PatchedProject.properties.shared.description
Whether this project is shared with others or personal

# components.schemas.PatchedProject.properties.mentors_to_add.description
List of mentor unique IDs to add to the project

# components.schemas.PatchedProject.properties.mentors_to_remove.description
List of mentor unique IDs to remove from the project

# components.schemas.PatchedRbacGroup.properties.users_to_remove.description
List of user IDs to remove from this group

# components.schemas.PatchedRbacGroup.properties.is_internal.description
When True, this group is internal to the system and cannot be viewed or modified by tenants via API endpoints.

# components.schemas.PatchedRbacPolicy.properties.name.description
Policy name. If not supplied, defaults to a UUID4

# components.schemas.PatchedRbacPolicy.properties.resources.description
List of resource paths this policy grants access to (e.g., ['/platforms/1/mentors', '/platforms/1/mentors/settings'])

# components.schemas.PatchedRbacPolicy.properties.users_to_remove.description
List of user IDs to remove from this Policy

# components.schemas.PatchedRbacPolicy.properties.groups_to_remove.description
List of group IDs to remove from this Policy

# components.schemas.PatchedRbacPolicy.properties.is_internal.description
When True, this policy is internal to the system and cannot be modified by tenants via API endpoints.

# components.schemas.PatchedRbacRole.properties.data_actions.description
List of data actions/permissions this role can perform for field-level access (e.g., ['Ibl.Mentor/Settings/name/read', 'Ibl.Mentor/Settings/email/write'])

# components.schemas.PatchedRbacRole.properties.is_internal.description
When True, this role is internal to the system and cannot be viewed or modified by tenants via API endpoints.

# components.schemas.PatchedSCIMGroup.description
SCIM group serializer for RBAC group management

# components.schemas.PatchedSCIMGroup.properties.id.description
RBAC group unique ID (must match existing RBAC group)

# components.schemas.PatchedSlackUserConfig.properties.slack_team_domain.description
Team Domain in the stated slack workspace. This is also the workspace name.

# components.schemas.PatchedTag.properties.platform.description
Platform this Tag belongs to. Set automatically from your credentials; you cannot pass another Platform's id.

# components.schemas.PatchedTag.properties.name.description
Display label shown on tag chips. Must be unique within your Platform (case-sensitive). Up to 64 characters.

# components.schemas.PatchedTag.properties.color.description
Hex color (e.g. `#3F6BFF`) used to render the chip. Six lowercase or uppercase hex digits with a leading `#`.

# components.schemas.PatchedTag.properties.metadata.description
Free-form JSON for Platform-defined attributes.

# components.schemas.PatchedTenantChatPrivacyConfig.description
Serializer for the tenant-wide chat-privacy config payload.

Shared by GET and PATCH on /orgs/{org}/chat-privacy-config/.

# components.schemas.PatchedTenantChatPrivacyConfig.properties.allow_user_chat_privacy_control.description
Whether the tenant allows end users to control their chat history privacy (anonymize or disable). When False, user and session preferences are ignored and history is always logged.

# components.schemas.PatchedUserGroup.properties.users_to_set.description
List of user IDs to set in this group (replaces all existing users)

# components.schemas.PatchedUserNotificationPreferences.description
Serializer for user notification preferences.

# components.schemas.PatchedUserPlatformMetadataUpdate.description
Update serializer for user platform metadata supporting partial key updates.

- To update keys: {"metadata": {"key1": "value1"}}
- To delete keys: {"delete_keys": ["key1", "key2"]}

# components.schemas.PatchedWatchedGroupUpdate.description
Payload for PATCH /watched-groups/{pk}/ — name only.

Watchers are managed via /watchers/; watched users via /watched-users/.

# components.schemas.PatchedWatcherUpdate.description
Payload for PATCH /watched-groups/{wg_pk}/watchers/{pk}/ — events only.

# components.schemas.PatchedWhatsappConfig.properties.access_token.description
Access token to the bot. This can also be a temporary access token.

# components.schemas.PatchedWorkflow.description
Serializer for Workflow CRUD operations.

Provides basic ReactFlow JSON validation (Phase 1) to ensure definitions
are renderable, while allowing draft workflows that may not be executable.

Comprehensive execution validation (Phase 2) is available via the
validate action endpoint.

Fields:
- All model fields are exposed
- Platform and creator are set automatically from URL context
- Read-only fields: id, unique_id, created_at, updated_at
- Chat settings (chat_name, chat_greeting, etc.) update the entry_mentor

# components.schemas.PatchedWorkflow.properties.parent_workflow.description
Parent workflow if this is a template variant

# components.schemas.PatchedWorkflow.properties.node_count.description
Get the number of nodes in the workflow definition.

# components.schemas.PatchedWorkflow.properties.edge_count.description
Get the number of edges in the workflow definition.

# components.schemas.PatchedWorkflow.properties.chat_name.description
Display name for chat (updates entry_mentor.name)

# components.schemas.Pathway.properties.slug.description
An additional unique slug field. (Optional)

# components.schemas.PathwayCompletionResponse.properties.completion_percentage.description
Overall completion percentage for the pathway (0.0 to 1.0)

# components.schemas.PathwayCreateUpdateRequest.description
Serializer for pathway creation/update request body.

# components.schemas.PathwayCreateUpdateRequest.properties.path.description
List of items in the pathway with item_id and optional position

# components.schemas.PathwayDeleteResponse.description
Serializer for pathway deletion response.

# components.schemas.PathwayEnrollmentRequest.description
Serializer for pathway enrollment request parameters.

# components.schemas.PathwayEnrollmentRequest.properties.include_default_platform.description
Include enrollments from default platform

# components.schemas.PathwayGroupSuggestionCreate.properties.platform_org.description
The organization identifier for the platform

# components.schemas.PathwayGroupSuggestionCreate.properties.department_mode.description
Flag to ensure department admins can call the API

# components.schemas.PathwayGroupSuggestionDetail.description
Response serializer for pathway group suggestion details

# components.schemas.PathwayGroupSuggestionDetail.properties.id.description
The unique identifier for the group suggestion

# components.schemas.PathwayGroupSuggestionDetail.properties.group_id.description
The ID of the group receiving the suggestion

# components.schemas.PathwayGroupSuggestionDetail.properties.group_name.description
The name of the group receiving the suggestion

# components.schemas.PathwayGroupSuggestionDetail.properties.platform_key.description
The platform key associated with the suggestion

# components.schemas.PathwayGroupSuggestionDetail.properties.accepted.description
Whether the suggestion has been accepted

# components.schemas.PathwayGroupSuggestionDetail.properties.pathway_platform_key.description
The platform key associated with the pathway

# components.schemas.PathwaySelfEnrollmentRequest.description
Serializer for pathway self-enrollment request parameters.

# components.schemas.PathwaySuggestionBulkCreate.properties.platform_org.description
The organization identifier for the platform

# components.schemas.PathwaySuggestionBulkCreate.properties.suggestion_data.description
List of suggestion data objects, each containing pathway_id, user_id, etc.

# components.schemas.PathwaySuggestionBulkCreate.properties.department_mode.description
Flag to ensure department admins can call the API

# components.schemas.PathwaySuggestionCreate.properties.username.description
The username of the user to suggest the pathway to

# components.schemas.PathwaySuggestionCreate.properties.email.description
The email of the user to suggest the pathway to

# components.schemas.PathwaySuggestionCreate.properties.department_mode.description
Flag to ensure department admins can call the API

# components.schemas.PathwaySuggestionDetail.description
Response serializer for pathway suggestion details

# components.schemas.PathwaySuggestionDetail.properties.id.description
The unique identifier for the suggestion

# components.schemas.PathwaySuggestionDetail.properties.user_id.description
The ID of the user receiving the suggestion

# components.schemas.PathwaySuggestionDetail.properties.username.description
The username of the user receiving the suggestion

# components.schemas.PathwaySuggestionDetail.properties.name.description
The full name of the user receiving the suggestion

# components.schemas.PathwaySuggestionDetail.properties.platform_key.description
The platform key associated with the suggestion

# components.schemas.PathwaySuggestionDetail.properties.accepted.description
Whether the suggestion has been accepted by the user

# components.schemas.PathwaySuggestionDetail.properties.visible.description
Whether the suggestion is visible to the user

# components.schemas.PathwaySuggestionDetail.properties.pathway_platform_key.description
The platform key associated with the pathway

# components.schemas.PeriodEnum.description
* `weekly` - weekly
* `monthly` - monthly
* `yearly` - yearly

# components.schemas.PeriodInfo.properties.range_type.description
Type of date range (custom, default, all_time, etc.)

# components.schemas.PeriodicAgent.properties.previous_agent.description
Agent that needs to run before the current agent runs.

# components.schemas.PeriodicAgent.properties.previous_agent_status.description
The status that the previous agent must be in before this agent gets scheduled.

* `success` - Success
* `error` - Error
* `running` - Running
* `pending` - Pending

# components.schemas.PeriodicAgent.properties.previous_agent_output.description
This will be fed into the run of this agent as part of its input prompt.

# components.schemas.PeriodicAgentCreate.properties.previous_agent.description
Agent that needs to run before the current agent runs.

# components.schemas.PeriodicAgentCreate.properties.previous_agent_status.description
The status that the previous agent must be in before this agent gets scheduled.

* `success` - Success
* `error` - Error
* `running` - Running
* `pending` - Pending

# components.schemas.PeriodicAgentCreate.properties.previous_agent_output.description
This will be fed into the run of this agent as part of its input prompt.

# components.schemas.PeriodicAgentLogStatusEnum.description
* `success` - Success
* `error` - Error
* `running` - Running

# components.schemas.PeriodicFrequencyEnum.description
* `DAILY` - DAILY
* `WEEKLY` - WEEKLY
* `MONTHLY` - MONTHLY
* `CUSTOM` - CUSTOM

# components.schemas.PeriodicLearnerScopeEnum.description
* `ACTIVE_LEARNERS` - ACTIVE_LEARNERS
* `ALL_LEARNERS` - ALL_LEARNERS

# components.schemas.PeriodicTask.properties.one_off.description
If True, the schedule will only run the task a single time

# components.schemas.PeriodicTask.properties.start_time.description
Datetime when the schedule should begin triggering the task to run

# components.schemas.PerlearnerEngagementVideosData.properties.average_class_watch.description
Average videos watched by students in course

# components.schemas.PerlearnerEngagementVideosData.properties.class_time_average.description
Average time spent by students on this course

# components.schemas.PerlearnerGradeSummaryData.properties.average_section_grade.description
Assignment section grade average in course

# components.schemas.PerlearnerGradingPerCourseAPIData.properties.problems_attempted.description
Number of problems from total problems attempted

# components.schemas.PerlearnerGradingPerCourseAPIData.properties.class_average.description
Average grade obtained by all learner in the course

# components.schemas.PermissionCheckRequest.description
Serializer for permission check requests

# components.schemas.PermissionCheckRequest.properties.resources.description
List of resource paths to check permissions for. Must start and end with '/' (e.g., ['/mentors/', '/mentors/123/', '/students/'])

# components.schemas.Person.description
Adds a read-only ``tags`` field to a host serializer.

Emits ``[{id, name, color}]``. Cheap when the host queryset uses
``prefetch_related("tag_assignments__tag")`` — without that prefetch
every record triggers two extra queries.

# components.schemas.Person.properties.id.description
Server-assigned UUID. Stable across renames and merges.

# components.schemas.Person.properties.platform.description
Platform the person belongs to. Set automatically from your credentials; you cannot pass another Platform's id.

# components.schemas.Person.properties.primary_email.description
Canonical email address. When a platform user is created with a matching email in your Platform, this person is automatically linked to them (case-insensitive).

# components.schemas.Person.properties.emails.description
Additional email addresses associated with this person.

# components.schemas.Person.properties.contact_numbers.description
Phone/contact numbers in any free-form shape.

# components.schemas.Person.properties.job_title.description
Role / job title — display only, not validated.

# components.schemas.Person.properties.organization.description
UUID of an organization in your Platform. References to organizations in other Platforms are rejected.

# components.schemas.Person.properties.owner.description
Id of the platform user who owns / manages this person (internal account manager). Optional.

# components.schemas.Person.properties.platform_user.description
Read-only. Populated once this person is bound to a platform user — either automatically on user creation when emails match, or explicitly via `POST /persons/{id}/link-user/`.

# components.schemas.Person.properties.lifecycle_stage.description
Sales pipeline stage. One of: `lead`, `qualified`, `opportunity`, `customer`, `churned`.

* `lead` - Lead
* `qualified` - Qualified
* `opportunity` - Opportunity
* `customer` - Customer
* `churned` - Churned

# components.schemas.Person.properties.unique_id.description
Optional external system id (e.g. import key from another CRM). When non-blank, must be unique within your Platform.

# components.schemas.Person.properties.active.description
Read-only. Set to `false` when the person is linked to a platform user or merged into another person.

# components.schemas.Person.properties.metadata.description
Free-form JSON for Platform-defined attributes.

# components.schemas.PersonInviteConflict.description
Shape returned when an active invitation already exists for this email.

# components.schemas.PersonInviteConflict.properties.invitation_id.description
Id of the pre-existing active invitation.

# components.schemas.PersonInviteRequest.properties.is_admin.description
Grant Platform-admin privileges on acceptance. Defaults to `false`.

# components.schemas.PersonInviteRequest.properties.is_staff.description
Grant staff privileges on acceptance. Defaults to `false`.

# components.schemas.PersonInviteRequest.properties.enrollment_config.description
Optional enrollment payload. Forwarded to the platform invitation to auto-enroll the invitee in the listed courses, programs, or pathways on acceptance.

# components.schemas.PersonInviteRequest.properties.redirect_to.description
URL to send the invitee to after they accept the invitation (e.g. a custom landing page, an enrollment screen). Passed straight through to the platform invitation row. Leave blank to use the platform default.

# components.schemas.PersonInviteResponse.description
Shape returned by `POST /persons/{id}/invite/`.

# components.schemas.PersonInviteResponse.properties.invitation_email.description
Email address the invitation was sent to.

# components.schemas.PersonInviteResponse.properties.platform_key.description
Key of the Platform the invitation targets.

# components.schemas.PersonInviteResponse.properties.auto_accept.description
Whether the invitation is auto-accepted when the invitee first signs in.

# components.schemas.PersonInviteResponse.properties.active.description
Whether the invitation is currently active.

# components.schemas.PersonInviteResponse.properties.redirect_to.description
URL the invitee will be sent to after accepting. Null/blank means the platform default destination.

# components.schemas.PersonLinkUserRequest.properties.user_id.description
Id of the platform user to bind to this person. The user must already be a member of your Platform — invite them first if they are not.

# components.schemas.PersonMergeRequest.properties.primary_id.description
UUID of the person to keep (the surviving record). Must belong to your Platform.

# components.schemas.PersonMergeRequest.properties.duplicate_ids.description
UUIDs of the persons to merge into `primary_id`. Each must belong to your Platform. `primary_id` may not appear in this list. The duplicates are marked inactive; their related records (deals, activities, tags) are re-parented onto the primary.

# components.schemas.PersonMergeResponse.description
Shape returned by `POST /persons/merge/`.

# components.schemas.PersonMergeResponse.properties.merged_ids.description
UUIDs of the persons marked inactive by this merge.

# components.schemas.PersonMergeResponse.properties.reparented.description
Per-relation counts of related records (deals, activities, tags) re-parented onto the primary.

# components.schemas.Pipeline.properties.platform.description
Platform this Pipeline belongs to. Set automatically from your credentials; you cannot pass another Platform's id.

# components.schemas.Pipeline.properties.name.description
Display name (e.g. 'B2B Sales', 'Renewals').

# components.schemas.Pipeline.properties.code.description
Stable slug used in API payloads. Unique per Platform; lowercase letters, digits, and hyphens.

# components.schemas.Pipeline.properties.is_default.description
Mark this as the default Pipeline new Deals land in when none is specified. At most one default per Platform — promoting a new default requires un-flagging the old one in the same call set.

# components.schemas.Pipeline.properties.rotten_days.description
Days a Deal can sit in a stage before it's surfaced as stale.

# components.schemas.Pipeline.properties.metadata.description
Free-form JSON for Platform-defined attributes.

# components.schemas.PipelineStage.properties.pipeline.description
Pipeline this stage belongs to. Set automatically from the URL path; you cannot move a stage between Pipelines.

# components.schemas.PipelineStage.properties.code.description
Stable identifier referenced by `Deal.stage` payloads. Unique within the Pipeline.

# components.schemas.PipelineStage.properties.probability.description
Win likelihood at this stage (0–100). Used for revenue forecasting.

# components.schemas.PipelineStage.properties.sort_order.description
Left-to-right position on the Kanban board.

# components.schemas.PipelineStage.properties.is_won.description
Closed-won terminal stage. Moving a Deal here sets `Deal.status='won'`.

# components.schemas.PipelineStage.properties.is_lost.description
Closed-lost terminal stage. Moving a Deal here sets `Deal.status='lost'`.

# components.schemas.PipelineStage.properties.metadata.description
Free-form JSON for Platform-defined attributes.

# components.schemas.Platform.description
Note: Create and update operations deprecated.

# components.schemas.Platform.properties.is_advertising.description
Advertising mode allows a platform to set custom usd balance to allocate for its members

# components.schemas.Platform.properties.show_paywall.description
If True, billing status/credit checks are enforced for this platform's users

# components.schemas.Platform.properties.enable_monetization.description
If True, this platform can resell via Stripe Connect (act as a merchant of record). Separate from show_paywall, which controls billing/credits enforcement.

# components.schemas.PlatformApiKey.properties.name.description
Name of the token. Used by the user to identify the token.

# components.schemas.PlatformApiKey.properties.expires_in.description
Optional duration until key expires. Format: [DD] [HH:[MM:]]ss[.uuuuuu]

# components.schemas.PlatformApiKey.properties.mode.description
How permissions resolve: 'owner' (default) uses the owner's RBAC permissions; 'token_policies' uses the policies/groups this token is associated with

* `owner` - Owner permissions
* `token_policies` - Token policies

# components.schemas.PlatformApiKey.properties.policies_to_add.description
RbacPolicy IDs to associate with this token (mode=token_policies)

# components.schemas.PlatformApiKey.properties.policies_to_remove.description
RbacPolicy IDs to disassociate from this token (mode=token_policies)

# components.schemas.PlatformApiKey.properties.groups_to_add.description
RbacGroup IDs to associate with this token (mode=token_policies)

# components.schemas.PlatformApiKey.properties.groups_to_remove.description
RbacGroup IDs to disassociate from this token (mode=token_policies)

# components.schemas.PlatformApiKeyModeEnum.description
* `owner` - Owner permissions
* `token_policies` - Token policies

# components.schemas.PlatformConfigurationList.description
Serializer for listing platform configurations

# components.schemas.PlatformConfigurationList.properties.configurations.description
Dictionary of configuration key-value pairs with proper type casting

# components.schemas.PlatformConfigurationSet.description
Serializer for setting platform configurations

# components.schemas.PlatformConfigurationSetResponse.description
Response serializer for setting platform configurations

# components.schemas.PlatformInvitationCreate.description
Request serializer for PlatformInvitationView POST endpoint

Supports new CSV format fields:
- company_name (optional): Company name for the invited user
- first_name (new): First name of the invited user
- last_name (new): Last name of the invited user
- user_group (new): Name of the UserGroup to assign the user to
- user_group_owner_email (optional): Email of user who should own the group

# components.schemas.PlatformInvitationCreate.properties.platform_key.description
The platform to create an invitation for

# components.schemas.PlatformInvitationCreate.properties.redirect_to.description
URL to redirect to after accepting the invitation

# components.schemas.PlatformInvitationCreate.properties.user_group.description
Name of the UserGroup to assign the user to

# components.schemas.PlatformInvitationCreate.properties.user_group_owner_email.description
Email of user who should own the group (falls back to uploader)

# components.schemas.PlatformInvitationDetail.description
Response serializer for platform invitation details

# components.schemas.PlatformInvitationDetail.properties.id.description
The unique identifier for the invitation

# components.schemas.PlatformInvitationDetail.properties.user_id.description
The ID of the user associated with the invitation

# components.schemas.PlatformInvitationDetail.properties.username.description
The username of the user associated with the invitation

# components.schemas.PlatformInvitationDetail.properties.email.description
The email address associated with the invitation

# components.schemas.PlatformInvitationDetail.properties.redirect_to.description
URL to redirect to after accepting the invitation

# components.schemas.PlatformInvitationDetail.properties.platform_key.description
The platform key associated with the invitation

# components.schemas.PlatformInvitationRedemption.properties.source.description
The source identifier for the invitation

# components.schemas.PlatformInvitationRedemption.properties.email.description
The email to associate with the invitation

# components.schemas.PlatformInvitationRedemption.properties.username.description
The username to associate with the invitation

# components.schemas.PlatformLicenseCreate.properties.platform_org.description
The organization identifier for the platform

# components.schemas.PlatformLicenseDetail.description
Response serializer for platform license details

# components.schemas.PlatformLicenseDetail.properties.platform_key.description
The platform key associated with the license

# components.schemas.PlatformLicenseUpdate.properties.license_id.description
The ID of the license to update (required if external_id not provided)

# components.schemas.PlatformLicenseUpdate.properties.external_id.description
External identifier of the license to update (required if license_id not provided)

# components.schemas.PlatformLicenseUpdate.properties.platform_org.description
The platform organization (not updatable)

# components.schemas.PlatformMembershipConfig.properties.allow_self_linking.description
Whether users can self-link to this platform

# components.schemas.PlatformMetrics.description
Serializer for detailed platform metrics (platform-specific view).

# components.schemas.PlatformMigrationRun.description
Read-only view of a platform migration run — the status/progress payload.

``run_id`` is the public task id callers poll on. ``report`` carries the
per-phase summaries, component selection, id-map totals and warnings written
by the runner. ``download_url`` is the link to pull the bundle as a ``.zip``
once a completed export has one on disk (null otherwise).

# components.schemas.PlatformMigrationRunCreate.description
Start a migration run. Validates the request; the view kicks the task.

``selected_components`` is the OPTIONAL-set selection; mandatory
sets always run regardless. An empty/omitted list = full fidelity.

# components.schemas.PlatformPrompt.description
Serializer for platform recommendation prompt management.

Used by instructors/admins to configure tenant-specific prompts for different SPAs.
A platform can have multiple prompts (one per SPA/frontend).

Note: spa_url will be automatically normalized (protocol stripped, lowercase) during validation.

# components.schemas.PlatformPrompt.properties.prompt_text.description
The custom recommendation strategy prompt

# components.schemas.PlatformPrompt.properties.recommendation_type.description
Prompt category. Use 'catalog' for courses/programs/resources/pathways; use 'mentors' for mentor prompts.

* `mentors` - Mentor Recommendations
* `catalog` - Catalog Recommendations

# components.schemas.PlatformPrompt.properties.spa_url.description
Frontend/SPA identifier (e.g., 'catalog.example.com', 'mentor-ai.ibl.com', 'https://mentor-ai.ibl.com'). Protocol and case will be normalized automatically. Leave blank for platform-wide prompts.

# components.schemas.PlatformPromptResponse.description
Response serializer for platform prompt retrieval.

# components.schemas.PlatformSkillPointBulkRequest.properties.platform_key.description
Platform key identifier (required for platform admin access)

# components.schemas.PlatformSkillPointBulkRequest.properties.skill_point_data.description
List of skill point data objects to create/update

# components.schemas.PlatformSkillPointGroupRequest.properties.point_data.description
Dictionary mapping skill names to point values to apply to group

# components.schemas.PlatformSkillPointGroupRequest.properties.overwrite.description
If True, removes all skills not in point_data. If False, only updates specified skills.

# components.schemas.PlatformSkillPointRequest.properties.point_data.description
Dictionary mapping skill names to point values. Example: {'skill_name': 5}

# components.schemas.PlatformSkillPointRequest.properties.overwrite.description
If True, removes all skills not in point_data. If False, only updates specified skills.

# components.schemas.PlatformSummary.description
Serializer for platform summary data (cross-platform view).

# components.schemas.PointsPercentile.properties.percentile.description
Percentile of points for user. If an `org` was provided, this is the percentile of the user relative to users within the org.

# components.schemas.PortalUrlResponse.description
Response containing a Stripe customer portal URL for subscription management.

# components.schemas.PreviewResponse.description
Response serializer for notification preview

# components.schemas.PreviousAgentStatusEnum.description
* `success` - Success
* `error` - Error
* `running` - Running
* `pending` - Pending

# components.schemas.PrivacyActionC61Enum.description
* `redact` - Redact
* `mask` - Mask
* `block` - Block
* `allow` - Allow

# components.schemas.ProgramCompletionResponse.properties.completion_percentage.description
Overall completion percentage for the program (0.0 to 1.0)

# components.schemas.ProgramCreateUpdateRequest.description
Serializer for program creation/update request body.

# components.schemas.ProgramCreateUpdateRequest.properties.course_list.description
List of courses in the program with course_id and optional position

# components.schemas.ProgramDeleteResponse.description
Serializer for program deletion response.

# components.schemas.ProgramEnrollment.properties.expired.description
Date when enrollment expires (null, if not expiring)

# components.schemas.ProgramEnrollmentPlus.properties.expired.description
Date when enrollment expires (null, if not expiring)

# components.schemas.ProgramGroupSuggestionCreate.properties.platform_org.description
The organization identifier for the platform

# components.schemas.ProgramGroupSuggestionCreate.properties.department_mode.description
Flag to ensure department admins can call the API

# components.schemas.ProgramGroupSuggestionDetail.description
Response serializer for program group suggestion details

# components.schemas.ProgramGroupSuggestionDetail.properties.id.description
The unique identifier for the group suggestion

# components.schemas.ProgramGroupSuggestionDetail.properties.group_id.description
The ID of the group receiving the suggestion

# components.schemas.ProgramGroupSuggestionDetail.properties.group_name.description
The name of the group receiving the suggestion

# components.schemas.ProgramGroupSuggestionDetail.properties.platform_key.description
The platform key associated with the suggestion

# components.schemas.ProgramGroupSuggestionDetail.properties.accepted.description
Whether the suggestion has been accepted

# components.schemas.ProgramInvitationCreate.description
Request serializer for ProgramInvitationView POST endpoint.

Supports CSV date fields for enrollment_config:
- program_access_start_date: Maps to enrollment_config['started']
- program_access_expiration_date: Maps to enrollment_config['expired']

# components.schemas.ProgramInvitationCreate.properties.redirect_to.description
URL to redirect to after accepting the invitation

# components.schemas.ProgramInvitationCreate.properties.program_access_start_date.description
Program access start date (maps to enrollment_config['started'])

# components.schemas.ProgramInvitationCreate.properties.program_access_expiration_date.description
Program access expiration date (maps to enrollment_config['expired'])

# components.schemas.ProgramInvitationDetail.description
Response serializer for program invitation details

# components.schemas.ProgramInvitationDetail.properties.id.description
The unique identifier for the invitation

# components.schemas.ProgramInvitationDetail.properties.user_id.description
The ID of the user associated with the invitation

# components.schemas.ProgramInvitationDetail.properties.username.description
The username of the user associated with the invitation

# components.schemas.ProgramInvitationDetail.properties.email.description
The email address associated with the invitation

# components.schemas.ProgramInvitationDetail.properties.redirect_to.description
URL to redirect to after accepting the invitation

# components.schemas.ProgramInvitationDetail.properties.program_key.description
The program key associated with the invitation

# components.schemas.ProgramInvitationRedemption.properties.source.description
The source identifier for the invitation

# components.schemas.ProgramInvitationRedemption.properties.email.description
The email to associate with the invitation

# components.schemas.ProgramInvitationRedemption.properties.username.description
The username to associate with the invitation

# components.schemas.ProgramLicenseAssignmentCreate.description
Request serializer for ProgramLicenseAssignmentView POST endpoint.

This serializer validates the request data for creating or updating a program license assignment.
Either user_id or email must be provided to identify the user to assign the license to.

Fields:
    license_id: The ID of the program license to assign
    user_id: The user ID to assign the license to (required if email not provided)
    username: The username to assign the license to (alternative to user_id)
    email: The email to assign the license to (required if user_id not provided)
    platform_key: The unique identifier for the platform (for permission validation)
    platform_org: The organization identifier for the platform (for permission validation)
    active: Whether the assignment should be active
    fulfilled: Whether the assignment should be marked as fulfilled
    direct: Whether the assignment is being directly assigned to the user
    redirect_to: URL to redirect to after fulfillment
    metadata: Additional metadata for the assignment

Notes:
    - If both user_id and email are provided, user_id takes precedence
    - If the user doesn't exist but email is provided, an email-only assignment will be created
    - The license must have available seats for the assignment to succeed

# components.schemas.ProgramLicenseAssignmentCreate.properties.user_id.description
The user ID to assign the license to (required if email not provided)

# components.schemas.ProgramLicenseAssignmentCreate.properties.username.description
The username to assign the license to (alternative to user_id)

# components.schemas.ProgramLicenseAssignmentCreate.properties.email.description
The email to assign the license to (required if user_id not provided)

# components.schemas.ProgramLicenseAssignmentCreate.properties.platform_key.description
The unique identifier for the platform (for permission validation)

# components.schemas.ProgramLicenseAssignmentCreate.properties.platform_org.description
The organization identifier for the platform (for permission validation)

# components.schemas.ProgramLicenseAssignmentCreate.properties.fulfilled.description
Whether the assignment should be marked as fulfilled

# components.schemas.ProgramLicenseAssignmentCreate.properties.direct.description
Whether the assignment is being directly assigned to the user

# components.schemas.ProgramLicenseAssignmentDetail.description
Response serializer for program license assignment details.

This serializer represents a program license assignment with all its attributes,
including user information, license details, and assignment status.

Fields:
    id: The unique identifier for the assignment
    user_id: The ID of the user assigned the license (may be null for email-only assignments)
    username: The username of the user assigned the license (may be null for email-only assignments)
    name: The full name of the user assigned the license (may be null for email-only assignments)
    email: The email address of the user assigned the license (may be null for user-only assignments)
    active: Whether the assignment is active and valid
    fulfilled: Whether the assignment has been processed/fulfilled
    direct: Whether the assignment was directly assigned to the user (vs. via a group)
    redirect_to: URL to redirect to after fulfillment
    metadata: Additional metadata for the assignment
    created: When the assignment was created
    modified: When the assignment was last modified
    license_id: The ID of the program license
    license_name: The name of the program license
    program_key: The program key associated with the license

# components.schemas.ProgramLicenseAssignmentDetail.properties.id.description
The unique identifier for the assignment

# components.schemas.ProgramLicenseAssignmentDetail.properties.username.description
The username of the user assigned the license

# components.schemas.ProgramLicenseAssignmentDetail.properties.name.description
The full name of the user assigned the license

# components.schemas.ProgramLicenseAssignmentDetail.properties.email.description
The email address of the user assigned the license

# components.schemas.ProgramLicenseAssignmentDetail.properties.active.description
Whether the assignment is active and valid

# components.schemas.ProgramLicenseAssignmentDetail.properties.fulfilled.description
Whether the assignment has been processed/fulfilled

# components.schemas.ProgramLicenseAssignmentDetail.properties.direct.description
Whether the assignment was directly assigned to the user (vs. via a group)

# components.schemas.ProgramLicenseAssignmentDetail.properties.program_key.description
The program key associated with the license

# components.schemas.ProgramLicenseCreateDetail.properties.platform_key.description
The unique identifier for the platform (required if platform_id not provided)

# components.schemas.ProgramLicenseCreateDetail.properties.platform_org.description
The organization identifier for the platform (required if platform_id not provided)

# components.schemas.ProgramLicenseCreateDetail.properties.platform_id.description
The ID of the platform (required if platform_key/org not provided)

# components.schemas.ProgramLicenseCreateDetail.properties.program_key.description
The unique identifier for the program to license

# components.schemas.ProgramLicenseDetail.description
Response serializer for program license details.

This serializer represents a program license with all its attributes,
including basic license information, program details, and usage statistics.

Fields:
    id: The unique identifier for the license
    created: When the license was created
    started: When the license becomes active
    expired: When the license expires (null if no expiration)
    name: The display name of the license
    count: The number of seats purchased
    active: Whether the license is active
    metadata: Additional license metadata
    source: The source identifier for the license
    external_id: External identifier for the license (null if none)
    platform_key: The platform key associated with the license
    program_id: The program ID associated with the license
    program_name: The name of the program associated with the license
    usage_count: Number of assignments using this license
    assignments: Assignment counts (if verbose mode is enabled)

Notes:
    - The assignments field is only included when verbose=true in the request
    - The expired field may be null if the license doesn't expire
    - The external_id field may be null if not provided

# components.schemas.ProgramLicenseDetail.properties.expired.description
When the license expires (null if no expiration)

# components.schemas.ProgramLicenseDetail.properties.external_id.description
External identifier for the license (null if none)

# components.schemas.ProgramLicenseDetail.properties.platform_key.description
The platform key associated with the license

# components.schemas.ProgramLicenseDetail.properties.program_id.description
The program ID associated with the license

# components.schemas.ProgramLicenseDetail.properties.program_key.description
The program key associated with the license

# components.schemas.ProgramLicenseDetail.properties.program_name.description
The name of the program associated with the license

# components.schemas.ProgramLicenseDetail.properties.usage_count.description
Number of assignments using this license

# components.schemas.ProgramLicenseDetail.properties.assignments.description
Assignment counts by status (only included in verbose mode)

# components.schemas.ProgramLicenseGroupAssignmentCreate.description
Request serializer for ProgramLicenseGroupAssignmentView POST endpoint.

This serializer validates the request data for creating or updating a program license group assignment.
Group assignments will automatically create individual assignments for all users in the group.

Fields:
    license_id: The ID of the program license to assign
    group_id: The ID of the user group to assign the license to
    platform_key: The unique identifier for the platform (for permission validation)
    platform_org: The organization identifier for the platform (for permission validation)
    active: Whether the group assignment should be active
    fulfilled: Whether the group assignment should be marked as fulfilled
    redirect_to: URL to redirect to after fulfillment
    metadata: Additional metadata for the group assignment

Notes:
    - All users in the group will receive individual license assignments
    - The license must have enough available seats for all users in the group
    - If the license doesn't have enough seats, the operation will fail
    - Users who already have a direct assignment to this license will not be affected

# components.schemas.ProgramLicenseGroupAssignmentCreate.properties.group_id.description
The ID of the user group to assign the license to

# components.schemas.ProgramLicenseGroupAssignmentCreate.properties.platform_key.description
The unique identifier for the platform (for permission validation)

# components.schemas.ProgramLicenseGroupAssignmentCreate.properties.platform_org.description
The organization identifier for the platform (for permission validation)

# components.schemas.ProgramLicenseGroupAssignmentCreate.properties.active.description
Whether the group assignment should be active

# components.schemas.ProgramLicenseGroupAssignmentCreate.properties.fulfilled.description
Whether the group assignment should be marked as fulfilled

# components.schemas.ProgramLicenseGroupAssignmentCreate.properties.metadata.description
Additional metadata for the group assignment

# components.schemas.ProgramLicenseGroupAssignmentDetail.description
Response serializer for program license group assignment details.

This serializer represents a program license group assignment with all its attributes,
including group information, license details, and assignment status.

Fields:
    id: The unique identifier for the group assignment
    group_id: The ID of the group assigned the license
    group_name: The name of the group assigned the license
    active: Whether the group assignment is active and valid
    fulfilled: Whether the group assignment has been processed/fulfilled
    redirect_to: URL to redirect to after fulfillment
    metadata: Additional metadata for the group assignment
    created: When the group assignment was created
    modified: When the group assignment was last modified
    license_id: The ID of the program license
    license_name: The name of the program license
    program_key: The program key associated with the license
    program_name: The name of the program associated with the license
    user_count: Number of users in the group
    assigned_count: Number of users in the group who have been assigned the license

# components.schemas.ProgramLicenseGroupAssignmentDetail.properties.id.description
The unique identifier for the assignment

# components.schemas.ProgramLicenseGroupAssignmentDetail.properties.group_id.description
The ID of the group assigned the license

# components.schemas.ProgramLicenseGroupAssignmentDetail.properties.group_name.description
The name of the group assigned the license

# components.schemas.ProgramLicenseGroupAssignmentDetail.properties.active.description
Whether the assignment is active and valid

# components.schemas.ProgramLicenseGroupAssignmentDetail.properties.fulfilled.description
Whether the assignment has been processed/fulfilled

# components.schemas.ProgramLicenseGroupAssignmentDetail.properties.program_key.description
The program key associated with the license

# components.schemas.ProgramLicenseGroupAssignmentDetail.properties.program_name.description
The name of the program associated with the license

# components.schemas.ProgramLicenseGroupAssignmentDetail.properties.assigned_count.description
Number of users in the group who have been assigned the license

# components.schemas.ProgramLicenseUpdateDetail.description
Request serializer for ProgramLicenseUpdateView POST endpoint.

This serializer validates the request data for updating an existing program license.
Either license_id or external_id must be provided to identify the license to update.

Fields:
    license_id: The ID of the license to update (required if external_id not provided)
    external_id: External identifier of the license to update (required if license_id not provided)
    name: Updated display name for the license
    count: Updated number of seats purchased
    started: Updated date when license should begin
    expired: Updated date when license should expire
    active: Updated active status
    metadata: Updated additional license metadata
    enrollment_config: Updated enrollment configuration
    source: Updated source identifier
    transaction_id: Transaction identifier for tracking
    change_type: Type of change being made (default: "update")

Notes:
    - Cannot update the platform or program associated with a license
    - A license history record is automatically created for each update
    - If count is reduced, it must not be less than the number of active assignments
    - Setting active=false will not deactivate existing assignments

# components.schemas.ProgramLicenseUpdateDetail.properties.license_id.description
The ID of the license to update (required if external_id not provided)

# components.schemas.ProgramLicenseUpdateDetail.properties.external_id.description
External identifier of the license to update (required if license_id not provided)

# components.schemas.ProgramMetadataRequest.description
Request serializer for ProgramMetadataView POST endpoint.

# components.schemas.ProgramMetadataRequest.properties.org.description
The organization associated with the program

# components.schemas.ProgramMetadataRequest.properties.platform_key.description
Platform key identifier (alternative to org)

# components.schemas.ProgramMetadataRequest.properties.program_key.description
Program key (alternative to program_id + org)

# components.schemas.ProgramMetadataResponse.description
Response serializer for ProgramMetadataView GET endpoint.

# components.schemas.ProgramReviewInfoResponse.description
Serializer for program review info response.

# components.schemas.ProgramReviewInfoResponse.properties.program_key.description
The program key associated with the reviews

# components.schemas.ProgramReviewPaginatedResponse.description
Paginated response serializer for ProgramReviewQueryView GET endpoint.

# components.schemas.ProgramReviewRequest.properties.program_key.description
The program key to review (format: program-v1:org+program_id)

# components.schemas.ProgramReviewRequest.properties.user_id.description
The user ID of the reviewer (alternative to username)

# components.schemas.ProgramSearch.properties.program_id.description
A unique program ID identifiable by edX.

# components.schemas.ProgramSearch.properties.enabled.description
Select if this program should be enabled.

# components.schemas.ProgramSearch.properties.slug.description
An additional unique slug field. (Optional)

# components.schemas.ProgramSuggestionBulkCreate.properties.platform_org.description
The organization identifier for the platform

# components.schemas.ProgramSuggestionBulkCreate.properties.suggestion_data.description
List of suggestion data objects, each containing program_key, user_id, etc.

# components.schemas.ProgramSuggestionBulkCreate.properties.department_mode.description
Flag to ensure department admins can call the API

# components.schemas.ProgramSuggestionCreate.properties.platform_org.description
The organization identifier for the platform

# components.schemas.ProgramSuggestionCreate.properties.username.description
The username of the user to suggest the program to

# components.schemas.ProgramSuggestionCreate.properties.email.description
The email of the user to suggest the program to

# components.schemas.ProgramSuggestionCreate.properties.department_mode.description
Flag to ensure department admins can call the API

# components.schemas.ProgramSuggestionDetail.description
Response serializer for program suggestion details

# components.schemas.ProgramSuggestionDetail.properties.id.description
The unique identifier for the suggestion

# components.schemas.ProgramSuggestionDetail.properties.user_id.description
The ID of the user receiving the suggestion

# components.schemas.ProgramSuggestionDetail.properties.username.description
The username of the user receiving the suggestion

# components.schemas.ProgramSuggestionDetail.properties.name.description
The full name of the user receiving the suggestion

# components.schemas.ProgramSuggestionDetail.properties.platform_key.description
The platform key associated with the suggestion

# components.schemas.ProgramSuggestionDetail.properties.accepted.description
Whether the suggestion has been accepted by the user

# components.schemas.ProgramSuggestionDetail.properties.visible.description
Whether the suggestion is visible to the user

# components.schemas.ProgramTypeEnum.description
* `bachelors` - Bachelor's Degree
* `masters` - Master's Degree
* `phd` - PhD
* `diploma` - Diploma
* `certificate` - Certificate
* `ungraded` - Ungraded
* `other` - Other

# components.schemas.Project.description
Unified serializer for Project model.

Write-only fields:
- mentors_to_add: List of mentor unique IDs to add to the project
- mentors_to_remove: List of mentor unique IDs to remove from the project

These fields are mutually exclusive and only used during create/update operations.
For create: only mentors_to_add is used
For update: either can be used, but not both at once

# components.schemas.Project.properties.shared.description
Whether this project is shared with others or personal

# components.schemas.Project.properties.mentors_to_add.description
List of mentor unique IDs to add to the project

# components.schemas.Project.properties.mentors_to_remove.description
List of mentor unique IDs to remove from the project

# components.schemas.ProjectMentor.description
Serializer for mentors within a project.

# components.schemas.PromptSearchResponse.properties.results.description
List of prompts matching the search criteria

# components.schemas.PromptSearchResponse.properties.count.description
Total number of prompts matching the search criteria

# components.schemas.PromptVisibilityEnum.description
* `viewable_by_tenant_admins` - Viewable By Tenant Admins
* `viewable_by_tenant_students` - Viewable By Tenant Students
* `viewable_by_anyone` - Viewable By Anyone

# components.schemas.Provider05cEnum.description
* `webex` - Webex
* `slack` - Slack
* `whatsapp` - Whatsapp
* `discord` - Discord
* `teams` - Teams

# components.schemas.ProvisionModeEnum.description
* `managed` - Managed
* `self_hosted` - Self-hosted

# components.schemas.QuestionRequest.description
Serializer for incoming request data that includes initial questions and the username.

Attributes:
    username (str): Username of the requesting student or user.
    initial_questions (list[InputQuestionSerializer]): List of initial questions provided by the LMS.
    question_count (int): Number of questions the mentor (llm) should generate

# components.schemas.QuestionResponse.description
Serializer for the response data that returns additional questions.

Attributes:
    follow_up_questions (list[LLMQuestionSerializer]): List of generated follow-up questions.

# components.schemas.RatingAverageRecord.description
Serializer for rating average overtime data.

# components.schemas.RatingAverageRecord.properties.value.description
Average rating value for this time period

# components.schemas.RbacBaseRole.properties.data_actions.description
List of data actions/permissions this role can perform for field-level access (e.g., ['Ibl.Mentor/Settings/name/read', 'Ibl.Mentor/Settings/email/write'])

# components.schemas.RbacGroup.properties.users_to_remove.description
List of user IDs to remove from this group

# components.schemas.RbacGroup.properties.is_internal.description
When True, this group is internal to the system and cannot be viewed or modified by tenants via API endpoints.

# components.schemas.RbacPolicy.properties.name.description
Policy name. If not supplied, defaults to a UUID4

# components.schemas.RbacPolicy.properties.resources.description
List of resource paths this policy grants access to (e.g., ['/platforms/1/mentors', '/platforms/1/mentors/settings'])

# components.schemas.RbacPolicy.properties.users_to_remove.description
List of user IDs to remove from this Policy

# components.schemas.RbacPolicy.properties.groups_to_remove.description
List of group IDs to remove from this Policy

# components.schemas.RbacPolicy.properties.is_internal.description
When True, this policy is internal to the system and cannot be modified by tenants via API endpoints.

# components.schemas.RbacPolicyGroup.description
Serializer for RBAC groups when returned in a policy.

We are limiting the returne data since we don't need everything there

# components.schemas.RbacRole.properties.data_actions.description
List of data actions/permissions this role can perform for field-level access (e.g., ['Ibl.Mentor/Settings/name/read', 'Ibl.Mentor/Settings/email/write'])

# components.schemas.RbacRole.properties.is_internal.description
When True, this role is internal to the system and cannot be viewed or modified by tenants via API endpoints.

# components.schemas.RecommendationTypeEnum.description
* `mentors` - Mentor Recommendations
* `catalog` - Catalog Recommendations

# components.schemas.RecommendedCoursesResponse.properties.results.description
List of content items matching the search criteria

# components.schemas.RecommendedCoursesResponse.properties.count.description
Total number of items matching the search criteria

# components.schemas.RedirectTokenRequest.properties.mentor_unique_id.description
Optional mentor unique ID for RBAC ownership check

# components.schemas.RemoveMentorFromDisclaimer.description
Serializer for removing a mentor from a disclaimer.

This serializer validates the mentor_id input and provides proper schema documentation
for the remove_mentor action.

# components.schemas.RemoveMentorFromDisclaimer.properties.mentor_id.description
The unique_id of the mentor to remove from the disclaimer.

# components.schemas.ReorderChildren.description
Validate input for reordering children of an xblock.

# components.schemas.ReorderChildren.properties.xblock_id.description
The parent xblock whose children to reorder.

# components.schemas.ReorderChildren.properties.children.description
Ordered list of child xblock IDs. All existing children must be included.

# components.schemas.ReportCreate.description
Returns this a report is successfully created

# components.schemas.ReportData.properties.extra_query_params.description
Extra parameters to be passed to the report create view, e.g learner_id

# components.schemas.ReportRequest.properties.report_name.description
Report slug, this is passed when calling the create report endpoint

# components.schemas.ReportRequest.properties.mentor.description
Mentor ID for the report (Only for mentor reports)

# components.schemas.ReportRequest.properties.course_id.description
Course ID for the report (Only for course reports)

# components.schemas.ReportRequest.properties.usergroup_ids.description
Optional list of usergroup IDs to filter results

# components.schemas.ReportRequest.properties.source.description
Domain/host the report is being requested from (e.g. analytics.example.com)

# components.schemas.ReportRequest.properties.query.description
Advanced Query to run the report, supports SQL Like queries. This runs against the final result after all filters are applied.

e.g For date type filtering
date_joined > '2021-01-01'

See https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.query.html#pandas.DataFrame.query
        

# components.schemas.ReportStatus.properties.report_name.description
Report slug, this is passed when calling the create report endpoint

# components.schemas.ReportStatus.properties.state.description
Report States

* `pending` - Pending
* `running` - Running
* `accumulating` - Accumulating
* `processing` - Processing
* `storing` - Storing
* `completed` - Completed
* `cancelled` - Cancelled
* `error` - Error
* `expired` - Expired

# components.schemas.ReportStatus.properties.expires.description
When report would expire and not available for download anymore

# components.schemas.ReportStatus.properties.created_at.description
When the report was requested (ISO 8601)

# components.schemas.ReportStatus.properties.poll_timeout.description
Seconds the client should poll before relying on notifications

# components.schemas.ReportedRoleCreateUpdateRequest.description
Serializer for reported role creation/update request parameters.

# components.schemas.ReportedRoleCreateUpdateRequest.properties.roles.description
List of roles (can be role IDs or objects with name, platform_key, etc.)

# components.schemas.ReportedSkillCreateUpdateRequest.description
Serializer for reported skill creation/update request parameters.

# components.schemas.ReportedSkillCreateUpdateRequest.properties.skills.description
List of skills (can be skill IDs or objects with name, platform_key, etc.)

# components.schemas.ResourceCompletion.description
Serializer for resource completion data used in both request and response.
Inherits common completion fields from CompletableBaseSerializer.

# components.schemas.ResourceCompletion.properties.skill_points_computed.description
Whether skill points have been evaluated

# components.schemas.ResourceCompletion.properties.username.description
The username associated with the completion

# components.schemas.ResourceCreateUpdate.properties.resource_type.description
Type of resource (e.g., video, document)

# components.schemas.ResourceCreateUpdate.properties.skills.description
List of skill names associated with the resource

# components.schemas.ResourceDeleteResponse.description
Serializer for resource deletion response.

# components.schemas.ResourceScrappedDataStatusEnum.description
* `scrapped` - Scraped
* `failed` - Failed
* `pending` - Pending
* `unscrapped` - Unscraped

# components.schemas.RetrieverDocumentEmbedding.properties.crawler_match_patterns.description
List of patterns that the crawler should use to match urls.
        Patterns may be a glob pattern or a full regex pattern.
        Indicate the specified type in `crawler_pattern_type`.

# components.schemas.RetrieverDocumentEmbeddingRequest.properties.crawler_match_patterns.description
The patterns that the crawler should use to match urls. Patterns may be a glob pattern or a full regex pattern. Indicate the specified type in `crawler_pattern_type`.

# components.schemas.RetrieverDocumentEmbeddingRequest.properties.crawler_pattern_type.description
Pattern type for the crawler

* `glob` - Glob
* `regex` - Regex

# components.schemas.RetrieverDocumentEmbeddingRequest.properties.access.description
The access of the document.

* `public` - Public
* `private` - Private

# components.schemas.RetrieverDocumentEmbeddingRequest.properties.google_drive_auth_data.description
Authentication and scoped details of google drive.

# components.schemas.RetrieverDocumentEmbeddingRequest.properties.dropbox_auth_data.description
Authentication and scoped details of dropbox

# components.schemas.RetrieverDocumentEmbeddingRequest.properties.custom_metadata.description
Custom metadata to attach to the trained document. Must be a flat JSON object with string keys and string, number, or boolean values.

# components.schemas.RetrieverRequestSearchDocument.properties.confidence_level.description
The percentge confidence level of the document retrieved

# components.schemas.RoleCreateUpdateRequest.description
Serializer for role creation/update request parameters.

# components.schemas.RoleEnum.description
* `viewer` - viewer
* `editor` - editor
* `chat` - chat
* `analytics_viewer` - analytics_viewer
* `dataset_curator` - dataset_curator

# components.schemas.Run.description
Read shape for an experiment run (Langfuse run + local pending entries).

Pending entries (``status="pending"`` or ``"in_progress"``) carry
``id=null`` and an additional ``task_id`` / ``task_record_id`` pair —
Langfuse mints the real run id only when the Celery task inserts the
first dataset_run_items row. Completed entries carry the Langfuse run
id and ``status="completed"``.

# components.schemas.RunDetailResponse.description
Run-detail response: run header + expanded items + pending judges.

# components.schemas.SCIMEnterpriseUser.description
SCIM enterprise user extension serializer

# components.schemas.SCIMEnterpriseUser.properties.platforms.description
List of platforms the user has access to

# components.schemas.SCIMGroup.description
SCIM group serializer for RBAC group management

# components.schemas.SCIMGroup.properties.id.description
RBAC group unique ID (must match existing RBAC group)

# components.schemas.SCIMName.description
SCIM name object serializer.
Fields allow_blank=True so response validation succeeds for users with no name set.

# components.schemas.SCIMUserCreateRequest.properties.platformOrgs.description
List of platform organizations to link the user to

# components.schemas.SCIMUserCreateRequest.properties.departmentIds.description
List of department IDs to make the user a member of

# components.schemas.SCIMUserCreateRequest.properties.rbacGroupUniqueIds.description
List of RBAC group unique IDs to add the user to

# components.schemas.ScopeC1dEnum.description
* `model` - Model Specific
* `provider` - Provider Wide

# components.schemas.Score.description
Read shape for a score (human annotation or LLM-judge result).

# components.schemas.ScoreConfigCategory.description
Category definition for categorical score configs.

# components.schemas.ScoreCreate.description
Validates score creation for human annotations.

# components.schemas.SellableItem.description
Response serializer for a single sellable item.

# components.schemas.SellableItemPaywall.description
Nested serializer for paywall status on a sellable item.

# components.schemas.SellableItemsResponse.description
Top-level response serializer for the sellable items endpoint.

# components.schemas.SendNotification.description
Request serializer for sending notification

# components.schemas.SendResponse.description
Response serializer for send notification

# components.schemas.ServiceTypeEnum.description
* `http` - HTTP
* `streaming` - Streaming
* `async` - Async

# components.schemas.SessionDisableChathistoryRequest.properties.disable_chathistory.description
When true, subsequent messages on this session are not written to ChatMessageHistory and the session is unlinked from the user. When false, the session reverts to honoring the user's normal privacy preferences. Future-only: already-recorded messages are not retroactively deleted.

# components.schemas.SessionDisableChathistoryResponse.description
Response body for the disable-chathistory toggle endpoint.

# components.schemas.SessionSummary.description
Lightweight serializer for session list endpoints (pinned/recent messages).

# components.schemas.SessionSummaryMentor.description
Lightweight mentor serializer for backward compatibility.

# components.schemas.SetStudentLLMAccess.description
Serializer for setting student LLM access permissions

# components.schemas.SetStudentLLMAccess.properties.platform_key.description
The platform key where the LLM access should be set

# components.schemas.SetStudentLLMAccess.properties.llm_resources.description
List of LLM resource paths. Format: ['llms/openai/models/gpt-4', 'llms/openai/', 'llms/']. Shorter paths grant access to all sub-resources.

# components.schemas.SetStudentMentorCreationPermission.description
Serializer for setting student mentor creation permission

# components.schemas.SetStudentMentorCreationPermission.properties.platform_key.description
The platform key where the permission should be changed

# components.schemas.SetStudentMentorCreationPermission.properties.allow_students_to_create_mentors.description
Whether to allow students to create mentors (true) or not (false)

# components.schemas.SkillCreateUpdateRequest.description
Serializer for skill creation/update request parameters.

# components.schemas.SkillsMetric.description
Serializer for skills metrics with breakdown.

# components.schemas.SlackUserConfig.properties.slack_team_domain.description
Team Domain in the stated slack workspace. This is also the workspace name.

# components.schemas.Spa.description
Serializer for SPA (Single Page Application)

# components.schemas.Spa.properties.name.description
SPA identifier (e.g. skills, mentor, admin)

# components.schemas.StarterPrompts8c6Enum.description
* `guided_prompt` - guided_prompt
* `suggested_prompt` - suggested_prompt

# components.schemas.StarterPromptsB04Enum.description
* `guided_prompt` - Guided Prompt
* `suggested_prompt` - Suggested Prompt

# components.schemas.StateEnum.description
* `pending` - Pending
* `running` - Running
* `accumulating` - Accumulating
* `processing` - Processing
* `storing` - Storing
* `completed` - Completed
* `cancelled` - Cancelled
* `error` - Error
* `expired` - Expired

# components.schemas.Status0e3Enum.description
* `active` - Active
* `free` - Free Tier
* `grandfathered` - Grandfathered
* `trialing` - Trialing
* `past_due` - Past Due
* `canceled` - Canceled
* `incomplete` - Incomplete

# components.schemas.Status147Enum.description
* `pending` - Pending
* `in_progress` - In Progress
* `completed` - Completed
* `failed` - Failed
* `canceled` - Canceled

# components.schemas.Status3daEnum.description
* `READ` - Read
* `UNREAD` - Unread
* `CANCELLED` - Cancelled

# components.schemas.StepStatusEnum.description
* `completed` - Completed
* `failed` - Failed
* `pending` - Pending

# components.schemas.StopGenerationRequest.properties.generation_id.description
The unique identifier of the generation to stop

# components.schemas.StripeCheckoutSessionRequest.description
Serializer for Stripe checkout session creation requests.

# components.schemas.StripeCheckoutSessionRequest.properties.tenant.description
Tenant type to create after successful checkout

# components.schemas.StripeCheckoutSessionRequest.properties.success_url.description
URL to redirect after successful payment

# components.schemas.StripeCheckoutSessionRequest.properties.mode.description
Checkout mode

* `subscription` - subscription
* `payment` - payment
* `setup` - setup

# components.schemas.StripeCheckoutSessionRequest.properties.period.description
Billing period

* `weekly` - weekly
* `monthly` - monthly
* `yearly` - yearly

# components.schemas.StripeCheckoutSessionRequestModeEnum.description
* `subscription` - subscription
* `payment` - payment
* `setup` - setup

# components.schemas.StripeCheckoutSessionResponse.description
Stripe checkout session serialized response

# components.schemas.StripeConnectDashboardLink.description
Serializer for Express Dashboard link response.

# components.schemas.StripeConnectOnboard.description
Serializer for Connect onboarding request.

# components.schemas.StripeConnectOnboard.properties.return_url.description
URL to redirect after onboarding completes

# components.schemas.StripeConnectOnboard.properties.refresh_url.description
URL to redirect if onboarding link expires

# components.schemas.StripeConnectOnboard.properties.business_type.description
Type of business

* `individual` - individual
* `company` - company

# components.schemas.StripeConnectOnboardResponse.description
Serializer for Connect onboarding response.

# components.schemas.StripeCustomerPortalRequest.properties.return_url.description
URL to redirect to when the customer exits the portal (back button)

# components.schemas.StripeCustomerPortalRequest.properties.subscription_id.description
Subscription ID required for subscription_update or subscription_cancel flows

# components.schemas.StripeCustomerPortalRequest.properties.flow_type.description
Type of flow to present: 'payment_method_update' for adding/updating payment method, 'subscription_update' for updating subscription, 'subscription_cancel' for cancellation. If not provided, shows the default portal homepage.

* `payment_method_update` - Payment Method Update
* `subscription_update` - Subscription Update
* `subscription_cancel` - Subscription Cancel

# components.schemas.StripeCustomerPortalRequest.properties.after_completion_url.description
URL to redirect after the flow is completed successfully. Only used when flow_type is set. Defaults to return_url if not provided.

# components.schemas.StripeNewUserTenantLaunchRequest.properties.is_advertising.description
Advertising mode allows a platform to set custom usd balance to allocate for its members

# components.schemas.StripePricingPageSessionResponse.description
Response for the unified pricing page identifier endpoint (auth + guest).

# components.schemas.SttProviderEnum.description
* `openai` - Openai
* `google` - Google
* `deepgram` - Deepgram
* `cartesia` - Cartesia
* `azure_openai` - Azure Openai

# components.schemas.StudentLLMAccessResponse.description
Serializer for student LLM access responses

# components.schemas.StudentLLMAccessResponse.properties.llm_resources.description
List of LLM resource paths that students can access. Format: ['llms/openai/models/gpt-4', 'llms/openai/', 'llms/']

# components.schemas.StudentMentorCreationPermissionResponse.description
Serializer for student mentor creation permission responses

# components.schemas.StudentMentorCreationPermissionResponse.properties.allow_students_to_create_mentors.description
Whether students can create mentors on this platform

# components.schemas.StudentMentorCreationPermissionResponse.properties.message.description
Success message (only in set permission response)

# components.schemas.Tag.properties.platform.description
Platform this Tag belongs to. Set automatically from your credentials; you cannot pass another Platform's id.

# components.schemas.Tag.properties.name.description
Display label shown on tag chips. Must be unique within your Platform (case-sensitive). Up to 64 characters.

# components.schemas.Tag.properties.color.description
Hex color (e.g. `#3F6BFF`) used to render the chip. Six lowercase or uppercase hex digits with a leading `#`.

# components.schemas.Tag.properties.metadata.description
Free-form JSON for Platform-defined attributes.

# components.schemas.TargetSystemEnum.description
* `Safety System` - Safety System
* `Moderation System` - Moderation System
* `Privacy System` - Privacy System

# components.schemas.TenantChatPrivacyConfig.description
Serializer for the tenant-wide chat-privacy config payload.

Shared by GET and PATCH on /orgs/{org}/chat-privacy-config/.

# components.schemas.TenantChatPrivacyConfig.properties.allow_user_chat_privacy_control.description
Whether the tenant allows end users to control their chat history privacy (anonymize or disable). When False, user and session preferences are ignored and history is always logged.

# components.schemas.TenantLaunchError.description
An unexpected error occurred during launch process

# components.schemas.TenantLaunchFailed.description
Launch process started but could not complete

# components.schemas.TenantLaunchRequest.properties.is_advertising.description
Advertising mode allows a platform to set custom usd balance to allocate for its members

# components.schemas.TimeSpentDetail.properties.overtime.description
Time spent over time data (when overtime=true)

# components.schemas.TimeSpentUpdateRequest.properties.timestamp.description
Time when the event occurred, ensure it is UTC (ISO 8601 format)

# components.schemas.TokenProvisionInput.description
Serializer for ConsolidatedTokenProvisionView POST input data.

Unlike TokenProxyInputSerializer (which resolves an existing user by exactly
one of user_id/username/email), provisioning needs a full identity to create
the user on edX, so both username and email are required.

# components.schemas.TokenProxyInput.description
Serializer for TokenProxyView POST request input data

# components.schemas.TokenProxyOutput.description
The SPA expects this outer data key so we need to create an extra layer

# components.schemas.TokenProxyUser.description
Serializer for User model for TokenProxyOutputSerializerData

# components.schemas.TopicsOverview.properties.topics.description
Topic metrics including all-time, monthly counts and percentage change

# components.schemas.TopicsOverview.properties.sessions.description
Session metrics including all-time, monthly counts and percentage change

# components.schemas.TopicsOverview.properties.conversations.description
Conversation metrics including all-time, monthly counts and percentage change

# components.schemas.TopicsOverview.properties.messages.description
Message metrics including all-time, monthly counts and percentage change

# components.schemas.TopicsOverviewMetric.description
Serializer for individual topic overview metrics.

# components.schemas.TopicsOverviewMetric.properties.percentage_change.description
Percentage change from last month to this month

# components.schemas.TrainDocumentViewRequest.properties.google_drive_auth_data.description
Authentication and scoped details of google drive

# components.schemas.TrainDocumentViewRequest.properties.dropbox_auth_data.description
Authentication and scoped details of dropbox

# components.schemas.TrainDocumentViewRequest.properties.crawler_match_patterns.description
The patterns that the crawler should use to match urls. Patterns may be a glob pattern or a full regex pattern. Indicate the specified type in `crawler_pattern_type`.

# components.schemas.TrainDocumentViewRequest.properties.crawler_pattern_type.description
Pattern type for the crawler

* `glob` - Glob
* `regex` - Regex

# components.schemas.TrainDocumentViewRequest.properties.custom_metadata.description
Custom metadata to attach to the trained document. Must be a flat JSON object with string keys and string, number, or boolean values.

# components.schemas.TrainDocumentViewRequest.properties.document_pool_only.description
Only adds document to document pool. Requires pathway to be empty.

# components.schemas.TrainDocumentViewRequest.properties.user_image_description.description
Description of an image submitted by the user for RAG.

# components.schemas.TrainDocumentViewRequest.properties.github_access_token.description
GitHub access token with repo scope. Required for private repositories.

# components.schemas.TrainingStatusEnum.description
* `trained` - Trained
* `failed` - Failed
* `pending` - Pending
* `untrained` - Untrained

# components.schemas.TransactionTypeEnum.description
* `add` - Add Credits
* `subtract` - Subtract Credits
* `reserve` - Reserve Credits
* `release` - Release Reserved Credits
* `rollover` - Rollover Credits
* `refund` - Refund Credits

# components.schemas.TtsProviderEnum.description
* `openai` - Openai
* `google` - Google
* `elevenlabs` - Elevenlabs
* `azure_openai` - Azure Openai

# components.schemas.Type4b7Enum.description
* `ACTIVITY_COURSE_MILESTONE` - Activity Course Milestone
* `ACTIVITY_NEW_CONTENT` - Activity New Content
* `ADMIN_NOTIF_COURSE_ENROLLMENT` - Admin Notif Course Enrollment
* `APP_REGISTRATION` - App Registration
* `COURSE_INVITATION` - Course Invitation
* `COURSE_LICENSE_ASSIGNMENT` - Course License Assignment
* `COURSE_LICENSE_GROUP_ASSIGNMENT` - Course License Group Assignment
* `COURSE_SCHEDULE_CHANGE` - Course Schedule Change
* `COURSES_PROGRESS_SUMMARY` - Courses Progress Summary
* `CRM_DEAL_STAGE_CHANGED` - Crm Deal Stage Changed
* `CRM_PERSON_CREATED` - Crm Person Created
* `CRM_PERSON_LINKED_TO_USER` - Crm Person Linked To User
* `CUSTOM_NOTIFICATION` - Custom Notification
* `DEFAULT_TEMPLATE` - Default Template
* `HUMAN_SUPPORT_NOTIFICATION` - Human Support Notification
* `PATHWAY_ENROLLMENT_CONFIRMATION` - Pathway Enrollment Confirmation
* `PLATFORM_INVITATION` - Platform Invitation
* `POLICY_ASSIGNMENT` - Policy Assignment
* `PROACTIVE_LEARNER_NOTIFICATION` - Proactive Learner Notification
* `PROGRAM_ENROLLMENT_CONFIRMATION` - Program Enrollment Confirmation
* `PROGRAM_INVITATION` - Program Invitation
* `PROGRAM_LICENSE_ASSIGNMENT` - Program License Assignment
* `PROGRAM_LICENSE_GROUP_ASSIGNMENT` - Program License Group Assignment
* `REPORT_COMPLETED` - Report Completed
* `ROLE_CHANGE` - Role Change
* `SKILL_MASTERY_CHANGE` - Skill Mastery Change
* `SUBSECTION_GRADE_UPDATE` - Subsection Grade Update
* `USER_LICENSE_ASSIGNMENT` - User License Assignment
* `USER_LICENSE_GROUP_ASSIGNMENT` - User License Group Assignment
* `USER_NOTIF_COURSE_COMPLETION` - User Notif Course Completion
* `USER_NOTIF_COURSE_ENROLLMENT` - User Notif Course Enrollment
* `USER_NOTIF_CREDENTIALS` - User Notif Credentials
* `USER_NOTIF_LEARNER_PROGRESS` - User Notif Learner Progress
* `USER_NOTIF_USER_INACTIVITY` - User Notif User Inactivity
* `USER_NOTIF_USER_REGISTRATION` - User Notif User Registration

# components.schemas.UpdateXblock.properties.content.description
New HTML content. Only applicable to component blocks (html, problem).

# components.schemas.UserApp.properties.subscription.description
The subscription details, would contain identifier, active, created_on, last_updated

# components.schemas.UserChatHistoryFilterData.description
Filter options for user-scoped chat history (no users field - always self).

# components.schemas.UserChatPrivacySettings.description
Serializer for user chat privacy settings.

# components.schemas.UserChatPrivacySettings.properties.chat_privacy_mode.description
User's global chat privacy preference

* `normal` - Normal
* `anonymized` - Anonymized
* `disabled` - Disabled

# components.schemas.UserChatPrivacySettings.properties.chat_privacy_enabled.description
Whether chat privacy control is enabled for this platform

# components.schemas.UserDemographicsResponse.properties.gender.description
Gender identity. One of: male, female, non_binary, prefer_not_to_say, other.

* `male` - Male
* `female` - Female
* `non_binary` - Non-binary
* `prefer_not_to_say` - Prefer not to say
* `other` - Other

# components.schemas.UserDemographicsResponse.properties.ethnicity.description
Ethnic background. See Ethnicity enum for valid values.

* `american_indian_alaska_native` - American Indian or Alaska Native
* `asian` - Asian
* `black_african_american` - Black or African American
* `hispanic_latino` - Hispanic or Latino
* `native_hawaiian_pacific_islander` - Native Hawaiian or Other Pacific Islander
* `white` - White
* `two_or_more` - Two or more races
* `prefer_not_to_say` - Prefer not to say
* `other` - Other

# components.schemas.UserDemographicsResponse.properties.primary_language.description
Primary language as ISO 639-1 code, e.g. 'en', 'es'.

# components.schemas.UserDemographicsResponse.properties.country_of_birth.description
Country of birth as ISO 3166-1 alpha-3 code, e.g. 'USA', 'MEX'.

# components.schemas.UserDemographicsResponse.properties.nationality.description
Nationality as ISO 3166-1 alpha-3 code, e.g. 'USA', 'MEX'.

# components.schemas.UserDemographicsResponse.properties.disability_status.description
Disability status. One of: yes, no, prefer_not_to_say.

* `yes` - Yes
* `no` - No
* `prefer_not_to_say` - Prefer not to say

# components.schemas.UserDemographicsWrite.properties.gender.description
Gender identity. One of: male, female, non_binary, prefer_not_to_say, other.

* `male` - Male
* `female` - Female
* `non_binary` - Non-binary
* `prefer_not_to_say` - Prefer not to say
* `other` - Other

# components.schemas.UserDemographicsWrite.properties.ethnicity.description
Ethnic background. See Ethnicity enum for valid values.

* `american_indian_alaska_native` - American Indian or Alaska Native
* `asian` - Asian
* `black_african_american` - Black or African American
* `hispanic_latino` - Hispanic or Latino
* `native_hawaiian_pacific_islander` - Native Hawaiian or Other Pacific Islander
* `white` - White
* `two_or_more` - Two or more races
* `prefer_not_to_say` - Prefer not to say
* `other` - Other

# components.schemas.UserDemographicsWrite.properties.primary_language.description
Primary language as ISO 639-1 code, e.g. 'en', 'es'.

# components.schemas.UserDemographicsWrite.properties.country_of_birth.description
Country of birth as ISO 3166-1 alpha-3 code, e.g. 'USA', 'MEX'.

# components.schemas.UserDemographicsWrite.properties.nationality.description
Nationality as ISO 3166-1 alpha-3 code, e.g. 'USA', 'MEX'.

# components.schemas.UserDemographicsWrite.properties.disability_status.description
Disability status. One of: yes, no, prefer_not_to_say.

* `yes` - Yes
* `no` - No
* `prefer_not_to_say` - Prefer not to say

# components.schemas.UserDemographicsWrite.properties.custom_fields.description
Custom field values as {slug: value} pairs. Slugs must match active field definitions.

# components.schemas.UserEdxMemory.properties.data.description
The course data to be stored. This includes the current page and the blocks that have been visited.

# components.schemas.UserGroup.properties.users_to_set.description
List of user IDs to set in this group (replaces all existing users)

# components.schemas.UserGroupAccess.description
ModelSerializer for user group access policies

# components.schemas.UserGroupAccess.properties.user_id.description
ID of the user to manage group access for

# components.schemas.UserGroupAccessInfo.description
Serializer for group access information in responses

# components.schemas.UserGroupAccessInfo.properties.permissions.description
List of permissions user has for this group (e.g., ['read', 'manageMentors'])

# components.schemas.UserGroupPolicy.description
Serializer for usergroup-specific RBAC policies using ModelSerializer pattern.
Accepts usergroup_id and role, generates resources and role internally.

# components.schemas.UserGroupPolicy.properties.name.description
Policy name. If not supplied, defaults to a UUID4

# components.schemas.UserGroupPolicy.properties.platform_key.description
Platform key where the usergroup belongs

# components.schemas.UserGroupPolicy.properties.usergroup_id.description
ID of the usergroup to manage access for

# components.schemas.UserGroupPolicy.properties.role.description
Role for accessing this usergroup (read, edit, view analytics, send notifications)

# components.schemas.UserGroupPolicy.properties.resources.description
List of resources this policy applies to

# components.schemas.UserGroupPolicy.properties.groups_to_add.description
List of RbacGroup IDs to grant access to this usergroup

# components.schemas.UserGroupPolicy.properties.groups_to_remove.description
List of RbacGroup IDs to revoke access from this usergroup

# components.schemas.UserGroupPolicy.properties.users_to_add.description
List of user IDs to grant access to this usergroup

# components.schemas.UserGroupPolicy.properties.users_to_remove.description
List of user IDs to revoke access from this usergroup

# components.schemas.UserLicenseAssignmentCreate.properties.platform_org.description
The organization identifier for the platform

# components.schemas.UserLicenseAssignmentCreate.properties.fulfilled.description
Whether the assignment has been fulfilled

# components.schemas.UserLicenseAssignmentDetail.description
Response serializer for user license assignment details

# components.schemas.UserLicenseAssignmentDetail.properties.id.description
The unique identifier for the assignment

# components.schemas.UserLicenseAssignmentDetail.properties.username.description
The username of the user assigned the license

# components.schemas.UserLicenseAssignmentDetail.properties.email.description
The email address of the user assigned the license

# components.schemas.UserLicenseAssignmentDetail.properties.fulfilled.description
Whether the assignment has been fulfilled

# components.schemas.UserLicenseAssignmentDetail.properties.platform_key.description
The platform key associated with the license

# components.schemas.UserLicenseCreate.description
Request serializer for UserLicenseCreateView POST endpoint

# components.schemas.UserLicenseCreate.properties.platform_org.description
The organization identifier for the platform

# components.schemas.UserLicenseDetail.description
Response serializer for user license details

# components.schemas.UserLicenseDetail.properties.platform_key.description
The platform key associated with the license

# components.schemas.UserLicenseDetail.properties.usage_count.description
Number of assignments using this license

# components.schemas.UserLicenseDetail.properties.assignments.description
Assignment counts by status (only included in verbose mode)

# components.schemas.UserLicenseGroupAssignmentCreate.properties.group_id.description
The ID of the user group to assign the license to

# components.schemas.UserLicenseGroupAssignmentCreate.properties.platform_org.description
The organization identifier for the platform

# components.schemas.UserLicenseGroupAssignmentCreate.properties.fulfilled.description
Whether the assignment has been fulfilled

# components.schemas.UserLicenseGroupAssignmentDetail.description
Response serializer for user license group assignment details

# components.schemas.UserLicenseGroupAssignmentDetail.properties.id.description
The unique identifier for the assignment

# components.schemas.UserLicenseGroupAssignmentDetail.properties.group_id.description
The ID of the group assigned the license

# components.schemas.UserLicenseGroupAssignmentDetail.properties.group_name.description
The name of the group assigned the license

# components.schemas.UserLicenseGroupAssignmentDetail.properties.fulfilled.description
Whether the assignment has been fulfilled

# components.schemas.UserLicenseGroupAssignmentDetail.properties.platform_key.description
The platform key associated with the license

# components.schemas.UserLicenseUpdate.description
Request serializer for UserLicenseUpdateView POST endpoint

# components.schemas.UserLicenseUpdate.properties.license_id.description
The ID of the license to update (required if external_id not provided)

# components.schemas.UserLicenseUpdate.properties.external_id.description
External identifier of the license to update (required if license_id not provided)

# components.schemas.UserLicenseUpdate.properties.platform_org.description
The platform organization (not updatable)

# components.schemas.UserMemoryContextRequest.properties.extra_data.description
Extra custom data to be added to the memory

# components.schemas.UserNotificationPreferences.description
Serializer for user notification preferences.

# components.schemas.UserPlatformMetadata.description
Read serializer for user platform metadata.

# components.schemas.UserPolicyUpdate.description
Serializer for updating user policies on a platform.

Accepts lists of policies to add and remove for a specific user on a platform.

# components.schemas.UserPolicyUpdate.properties.platform_key.description
Platform key where the user's policies should be updated

# components.schemas.UserPolicyUpdate.properties.policies_to_remove.description
List of policy names to remove from the user

# components.schemas.UserPolicyUpdate.properties.policies_to_set.description
List of policy names to set for the user (replaces all existing policies with these)

# components.schemas.UserReportListResponse.properties.reports.description
List of user's reports with their status

# components.schemas.UserSearchResponse.properties.results.description
List of search results (can include user_resume, education, institution, etc.)

# components.schemas.UserSkill.properties.courses.description
Courses with skill and associated points

# components.schemas.UserSkill.properties.resources.description
Resources with skill and associated points

# components.schemas.UserSkillPointsPercentile.properties.percentile.description
Percentile of points for user. If an `org` was provided, this is the percentile of the user relative to users within the org.

# components.schemas.V2GlobalMentorSearchResponse.description
Response serializer for V2 Global Mentor Search.

# components.schemas.V2PersonalizedMentorsResponse.description
Response serializer for V2 Personalized Mentors Search.

# components.schemas.V2PersonalizedMentorsResponse.properties.results.description
List of personalized mentor search results

# components.schemas.V2RecommendationResponse.description
Response serializer for V2 Course Recommendations.

Returns a list of recommended courses with AI-generated reasoning.
Includes metadata about the recommendation method used (RAG vs LLM).

# components.schemas.V2RecommendationResponse.properties.recommendations.description
List of course recommendations with reasoning

# components.schemas.V2RecommendationResponse.properties.user_context.description
Summary of user context used for recommendations

# components.schemas.V2RecommendationResponse.properties.recommendation_id.description
Unique ID for this recommendation set (for tracking)

# components.schemas.V2RecommendationResponse.properties.generated_at.description
When these recommendations were generated

# components.schemas.V2RecommendationResponse.properties.method_used.description
Method used to generate recommendations: 'rag_only', 'llm_only', or 'rag_plus_llm'

# components.schemas.V2RecommendationResponse.properties.search_query_used.description
The actual search query used for RAG similarity search (if applicable)

# components.schemas.V2RecommendationResponse.properties.candidates_retrieved.description
Number of candidates retrieved via RAG before filtering (if applicable)

# components.schemas.V2RecommendationResponse.properties.includes_main_catalog.description
Whether the results include items from the 'main' tenant catalog

# components.schemas.V2RecommendationResponse.properties.processing_time_seconds.description
Time taken to generate recommendations (in seconds)

# components.schemas.V2RecommendationResponse.properties.count.description
Total number of recommendations available

# components.schemas.V2RecommendationResponse.properties.next.description
URL for the next page of results (if pagination is enabled)

# components.schemas.V2RecommendationResponse.properties.previous.description
URL for the previous page of results (if pagination is enabled)

# components.schemas.ValidateSourceResponse.description
Response serializer for source validation

# components.schemas.VideoEngagementPerCourseData.properties.time_watched.description
Total time spent by all users watching videos

# components.schemas.VideoEngagementPerCourseData.properties.avg_percent_watched.description
Average percentage of videos watched per user per course

# components.schemas.VideosCountData.properties.count.description
Total videos (videos watched / Total Course Videos)

# components.schemas.VideosWatchedSubSection.properties.total_watch.description
Total videos watched. N/A if no record found

# components.schemas.VoiceProviderD5aEnum.description
* `browser` - Browser
* `openai` - OpenAI
* `google` - Google

# components.schemas.VoiceProviderEnum.description
* `browser` - Browser
* `openai` - Openai
* `google` - Google
* `elevenlabs` - Elevenlabs

# components.schemas.WakeModeEnum.description
* `now` - now
* `next-heartbeat` - next-heartbeat

# components.schemas.WakeRequest.description
Body for ``POST wake/`` — sent to the ``wake`` RPC.

# components.schemas.WakeResponse.description
Documents the ``wake`` RPC response.

The upstream ``context.cron.wake(...)`` shape isn't pinned in the
published docs; fields here are the ones consistently observed in
practice.  Treat as best-effort — additional fields may be present.

# components.schemas.WatchedGroupCreate.description
Payload for POST /watched-groups/.

Platform is resolved by the view (auth token for normal callers, query
param or body `platform_key` for service accounts) and passed via
`context["platform"]`. The body `platform_key` field is consumed by the
view, not the serializer.

`owner_id` is reserved for service-account callers. Platform users are
implicitly the owner; specifying `owner_id` from a platform user yields 400.

# components.schemas.WatchedGroupDetail.description
Detail shape — counts plus opt-in inline collections.

`watchers` honors `watcher_limit` from context (default 0).
`watched_users` honors `watched_user_limit` from context (default 0).
Use the dedicated sub-resources for paginated walks.

# components.schemas.WatchedGroupList.description
Lean shape for list responses — no watchers, no watched_users, no counts.

# components.schemas.WatchedGroupUpdate.description
Payload for PATCH /watched-groups/{pk}/ — name only.

Watchers are managed via /watchers/; watched users via /watched-users/.

# components.schemas.WatchedUserRead.description
Output for a single user inside a WatchedGroup.

The entity is the user — `id` is the user's id (matching the URL pk). The
underlying `UserGroupLink.id` is a routing artifact and isn't surfaced.

# components.schemas.WatcherEntry.description
A single watcher entry in the create payload: who watches and which events.

# components.schemas.WatcherRead.description
Output for a watcher (a user watching a WatchedGroup).

The entity is the user — `id` is the watcher's user id (matching the URL
pk). The underlying `WatcherToWatchedGroup.id` is a routing artifact and
isn't surfaced.

# components.schemas.WatcherRead.properties.events.description
List of events the watcher is subscribed to for this group

# components.schemas.WatcherUpdate.description
Payload for PATCH /watched-groups/{wg_pk}/watchers/{pk}/ — events only.

# components.schemas.WhatsappConfig.properties.access_token.description
Access token to the bot. This can also be a temporary access token.

# components.schemas.Workflow.description
Serializer for Workflow CRUD operations.

Provides basic ReactFlow JSON validation (Phase 1) to ensure definitions
are renderable, while allowing draft workflows that may not be executable.

Comprehensive execution validation (Phase 2) is available via the
validate action endpoint.

Fields:
- All model fields are exposed
- Platform and creator are set automatically from URL context
- Read-only fields: id, unique_id, created_at, updated_at
- Chat settings (chat_name, chat_greeting, etc.) update the entry_mentor

# components.schemas.Workflow.properties.parent_workflow.description
Parent workflow if this is a template variant

# components.schemas.Workflow.properties.node_count.description
Get the number of nodes in the workflow definition.

# components.schemas.Workflow.properties.edge_count.description
Get the number of edges in the workflow definition.

# components.schemas.Workflow.properties.chat_name.description
Display name for chat (updates entry_mentor.name)

# components.schemas.XblockResult.description
Standard response for xblock operations.

# components.schemas.XblockTypeEnum.description
* `section` - section
* `subsection` - subsection
* `unit` - unit
* `html` - html
* `problem` - problem
* `video` - video

# components.schemas._TagAttachRequest.properties.tag_id.description
Id of the Tag to attach. Must belong to your Platform.