diff --git a/_myassets/_sass/_theme.scss b/_myassets/_sass/_theme.scss
index b22f0de..a00ed32 100644
--- a/_myassets/_sass/_theme.scss
+++ b/_myassets/_sass/_theme.scss
@@ -9,17 +9,6 @@
--accent-hover-back-color: #fae8e8;
--accent-border-color: #8f3838;
--accent-contrast-color: #fff;
-
- // DAX Syntax
- --code-comment-color: #39A03B;
- --code-string-color: #D93124;
- --code-column-color: #333;
- --code-function-color: #035ACA;
- --code-keyword-color: #035ACA;
- --code-measure-color: #333;
- --code-operator-color: #333;
- --code-number-color: #EE7F18;
- --code-parenthesis-color: #808080;
}
// Dark colors
@@ -31,15 +20,4 @@
--accent-hover-back-color: #fae8e8;
--accent-border-color: #8f3838;
--accent-contrast-color: #fff;
-
- // DAX Syntax
- --code-comment-color: #86C573;
- --code-string-color: #E44;
- --code-column-color: #fff;
- --code-function-color: #0095ff;
- --code-keyword-color: #0095ff;
- --code-measure-color: #fff;
- --code-operator-color: #fff;
- --code-number-color: #EE7F18;
- --code-parenthesis-color: #636363;
}
\ No newline at end of file
diff --git a/_mydocs/analyze-in-excel/index.md b/_mydocs/analyze-in-excel/index.md
index 3141c71..ad0ba07 100644
--- a/_mydocs/analyze-in-excel/index.md
+++ b/_mydocs/analyze-in-excel/index.md
@@ -1,5 +1,5 @@
---
-layout: home
+layout: page
title: Analyze in Excel for Power BI Desktop
menu_title: Analyze in Excel for Power BI
published: false
diff --git a/_mydocs/api/index.md b/_mydocs/api/index.md
new file mode 100644
index 0000000..f4b2cd9
--- /dev/null
+++ b/_mydocs/api/index.md
@@ -0,0 +1,12 @@
+---
+layout: page
+title: SQLBI API Reference (Beta)
+menu_title: SQLBI API
+published: true
+order: /zzzz
+next_reading: true
+next_reading_title: Available APIs
+---
+The SQLBI API is organized around [REST](http://en.wikipedia.org/wiki/Representational_State_Transfer). Our API is designed to be easy to use and to support the most common use cases. We have tried to make the API as predictable as possible, so you can easily predict the URLs and the structure of the JSON responses.
+
+> The SQLBI API are in **beta** and we are working to improve them. If you have any feedback, please [let us know](mailto:info@sqlbi.com?subject=SQLBI%20API).
\ No newline at end of file
diff --git a/_mydocs/api/licensing/courses.md b/_mydocs/api/licensing/courses.md
new file mode 100644
index 0000000..1598c5a
--- /dev/null
+++ b/_mydocs/api/licensing/courses.md
@@ -0,0 +1,79 @@
+---
+layout: page
+title: Courses
+published: true
+order: /1
+---
+The `Course` object contains information about the courses to which the license manager has access. This includes the total number of licenses, the number of licenses assigned, and the remaining licenses available for assignment. Additionally, it lists the license pools associated with each course, including the start and end dates of the pool, the number of licenses in the pool, and the number of licenses that have been assigned.
+
+## Endpoints
+
+`GET https://www.sqlbi.com/api/licensing/v1/courses`
+
+`GET https://www.sqlbi.com/api/licensing/v1/course/{id}`
+
+> Each endpoint is authenticated using a bearer token. The token must be included in the *Authorization* header of the request. See more in the [Authentication](index#authentication) section.
+
+### `GET` / v1 / courses
+Retrieve a list of all courses you have access to. Here is how to make this request using curl:
+
+```bash
+curl -X GET "https://www.sqlbi.com/api/licensing/v1/courses" \
+ -H "Authorization: Bearer eyJ0eXA*****"
+```
+
+#### Response
+A successful request will return a JSON array of courses. See the `Course` object response below for more details.
+
+#### Response Fields
+See the `Course` object fields below for a description of each field.
+
+### `GET` / v1 / course / {id}
+Retrieve detailed information about a specific course by providing the course ID:
+
+```bash
+curl -X GET "https://www.sqlbi.com/api/licensing/v1/course/37571" \
+ -H "Authorization: Bearer eyJ0eXA*****"
+```
+
+#### Response
+A JSON object containing detailed information about the specific course, including its license pools.
+
+```json
+// Course #37571
+{
+ "id": "37571",
+ "title": "Mastering DAX Video Course",
+ "licenses": 10,
+ "assignedLicenses": 4,
+ "availableLicenses": 6,
+ "pools": [
+ {
+ "id": 21,
+ "start": "2022-11-13T19:46:06+00:00",
+ "end": "2025-11-13T00:00:00+00:00",
+ "transferable": false,
+ "licenses": 1,
+ "assignedLicenses": 1,
+ "availableLicenses": 0
+ }
+ ]
+}
+```
+
+#### Response Fields
+Each `Course` object contains the following fields:
+
+- `id`: The unique identifier for the course.
+- `title`: The name of the course.
+- `licenses`: The total number of licenses purchased for the course.
+- `assignedLicenses`: The number of licenses that have already been assigned to students.
+- `availableLicenses`: The number of licenses that are currently unassigned and available for use.
+- `pools`: An array of license pools associated with the course. Each pool object includes:
+ - `id`: The unique identifier for the license pool.
+ - `start`: The start date and time for the license pool, formatted as an ISO 8601 date string.
+ - `end`: The expiration date and time of the license pool, also in ISO 8601 format.
+ - `transferable`: A boolean indicating whether the licenses in this pool are transferable (true) or untrasferable (false). [See the difference](https://www.sqlbi.com/transferable-video-course-licenses/).
+ - `licenses`: The total number of licenses in the pool.
+ - `assignedLicenses`: The number of licenses from this pool that have been assigned.
+ - `availableLicenses`: The number of licenses from this pool that are currently available to be assigned.
\ No newline at end of file
diff --git a/_mydocs/api/licensing/index.md b/_mydocs/api/licensing/index.md
new file mode 100644
index 0000000..9ddb23e
--- /dev/null
+++ b/_mydocs/api/licensing/index.md
@@ -0,0 +1,75 @@
+---
+layout: page
+title: Licensing API
+menu_title: Licensing
+published: true
+order: /
+---
+This API allows SQLBI license managers to manage course licenses, including querying, assigning, and updating licenses across a variety of courses offered by SQLBI. It also enables the management of students and interrogation of their course progress.
+
+To become a license manager, you must have purchased an SQLBI video course with a transferable license (or with an *unassigned* untransferable license). If you are interested in learning more about our licensing options, please visit the [Transferable vs. Untransferable Licenses](https://www.sqlbi.com/transferable-video-course-licenses/) page.
+
+> Note the API is not required to manage your licenses since [we offer a web interface to manage them](https://www.sqlbi.com/license-manager-guide/). The API is intended for advanced users who want to automate the management of licenses or to integrate our licensing system with their own systems.
+
+## Base URL
+
+The base URL for the SQLBI Licensing API is:
+
+```
+https://www.sqlbi.com/api/licensing
+```
+
+## Authentication
+
+To access the Licensing API, you need to authenticate using a bearer token. This token must be included as a header in each of your requests. Here's how you can generate and use your API token:
+
+- Generate an API token in the [API section of the License Manager](https://www.sqlbi.com/license-manager-guide/#tokens).
+- Use this token by including it in the *Authorization* header as bearer token. For example:
+
+```bash
+curl -X GET "https://www.sqlbi.com/api/licensing/v1/me" \
+ -H "Authorization: Bearer {token}"
+```
+
+> Note that the API token is a secret key that **should be kept confidential**. Do not share it in public forums or with unauthorized users. If you suspect that your token has been compromised, you can revoke the old one and regenerate it in the License Manager.
+
+## Errors
+
+The API uses standard HTTP status codes to indicate the success or failure of requests. Common responses include:
+
+- `200 OK`: The request was successful.
+- `400 Bad Request`: The request was invalid. Details about the error will be included in the response body.
+- `401 Unauthorized`: The request did not include a valid API token.
+- `403 Forbidden`: The provided API token does not have the necessary permissions for the requested operation.
+- `404 Not Found`: The requested resource does not exist.
+- `429 Too Many Requests`: You have hit the rate limit for the API.
+- `500 Internal Server Error`: An error occurred on the server. Please try again later.
+
+## Pagination
+
+To ensure the performance and reliability of the API, responses that return a list of items are paginated. The **default number of items per page is 10**. You can navigate through the pages using the `page` parameter and customize the page size using the `pageSize` parameter in your request.
+
+Example:
+
+```bash
+curl -X GET "https://www.sqlbi.com/api/licensing/v1/students?page=2&pageSize=20" \
+ -H "Authorization: Bearer eyJ0eXA*****"
+```
+*Returns the second page of 20 students per page.*
+
+## Rate limits
+
+We implement rate limiting to ensure fair usage and stability of the API for all users. When you exceed the rate limit, you will receive a `429 Too Many Requests` response.
+
+The current limit is set to **25 requests per minute**.
+> Note that this limit may change over time based on usage patterns and server load.
+
+## Namespaces
+
+The Licensing API consists of several namespaces and endpoints that allow you to manage your licenses and students effectively:
+
+- [Me](me): Retrieve details about the license manager, including available licenses and pools.
+- [Courses](courses): Access the list of courses you have licenses for.
+- [Pools](pools): Manage your license pools.
+- [Licenses](licenses): Query and manage licenses assigned to students.
+- [Students](students): Get details about students and their course progress.
\ No newline at end of file
diff --git a/_mydocs/api/licensing/licenses.md b/_mydocs/api/licensing/licenses.md
new file mode 100644
index 0000000..572f48c
--- /dev/null
+++ b/_mydocs/api/licensing/licenses.md
@@ -0,0 +1,119 @@
+---
+layout: page
+title: Licenses
+published: true
+order: /3
+---
+The `License` object represents a course license assigned to a student. It includes the student's name, email address, the course title, the license start and end dates, and the license status.
+
+> While you can revoke a license by providing its id and using the `v1/license` endpoint, to assign a new license to a student, you must use to the `/v1/pool/` endpoint. See more in the [Pools](pools) section.
+
+## Endpoints
+
+`GET https://www.sqlbi.com/api/licensing/v1/licenses`
+
+`GET https://www.sqlbi.com/api/licensing/v1/license/{id}`
+
+`PATCH https://www.sqlbi.com/api/licensing/v1/license/{id}`
+
+`DELETE https://www.sqlbi.com/api/licensing/v1/license/{id}`
+
+> Each endpoint is authenticated using a bearer token. The token must be included in the *Authorization* header of the request. See more in the [Authentication](index#authentication) section.
+
+### `GET` / v1 / licenses
+
+Retrieve a list of all assigned licenses with details about the associated student and course. Supports pagination and filtering inactive licenses.
+
+```bash
+curl -X GET "https://www.sqlbi.com/api/licensing/v1/licenses?pageSize=50" \
+ -H "Authorization: Bearer eyJ0eXA*****"
+```
+
+#### Query Parameters
+
+- `page`: (Optional) The page number to retrieve. Default is `1`.
+- `pageSize`: (Optional) The number of licenses to retrieve per page. Default is `10`.
+- `includeInactive`: (Optional) Whether to include inactive licenses in the response. Default is `false`.
+
+#### Response
+A JSON array of objects, each representing a license. See the `License` object response below for more details.
+
+#### Response Fields
+See the `License` object fields below for a description of each field.
+
+### `GET` / v1 / license / {id}
+
+Retrieve detailed information about a specific license by providing the license ID:
+
+```bash
+curl -X GET "https://www.sqlbi.com/api/licensing/v1/license/29" \
+ -H "Authorization: Bearer eyJ0eXA*****"
+```
+
+#### Response
+A JSON object detailing the specific license, including the student and course information.
+
+```json
+// License #29
+{
+ "id": "29",
+ "poolId": "26",
+ "courseId": "51030",
+ "start": "2024-04-17T15:23:08+00:00",
+ "end": "2025-01-01T00:00:00+00:00",
+ "active": true,
+ "revokable": true,
+ "editable": true,
+ "student": {
+ "id": "16521",
+ "name": "Student",
+ "email": "student@sqlbi.com"
+ }
+}
+```
+
+#### Response Fields
+
+- `id`: The unique identifier for the license.
+- `poolId`: The identifier of the pool from which the license is allocated.
+- `courseId`: The identifier of the course associated with the license.
+- `start`: The start date and time of the license validity period in ISO 8601 format.
+- `end`: The end date and time of the license validity period in ISO 8601 format.
+- `revokable`: A boolean indicating whether the license can be revoked (true) or not (false).
+- `editable`: A boolean indicating whether the license end date can be edited (true) or not (false).
+- `student`: An object containing:
+ - `id`: The unique identifier for the student.
+ - `name`: The name of the student.
+ - `email`: The email address of the student.
+
+
+### `PATCH` / v1 / license / {id}
+Update the expiration date of a license. Note that:
+- The update is allowed only if the parent license pool is transferable.
+- The uupdate is allowed only if the license is not expired.
+- If you put a date in the past, the license will be immediately expired and cannot be updated anymore.
+- If you put a date in the future, the license cannot be extended further than the pool expiration date.
+
+```bash
+curl -X PATCH "https://www.sqlbi.com/api/licensing/v1/license/29" \
+ -H "Authorization: Bearer eyJ0eXA*****" \
+ -H "Content-Type: application/json" \
+ -d '{"endDate": "2027-04-18"}'
+```
+
+#### Request Body
+- `endDate`: The new expiration date of the license in YYYY-MM-DD format.
+
+#### Response
+A JSON object representing the updated license.
+
+### `DELETE` / v1 / license / {id}
+Revoke a license. The license will be immediately expired, and the student will lose access to the course.
+
+```bash
+curl -X DELETE "https://www.sqlbi.com/api/licensing/v1/license/26" \
+ -H "Authorization: Bearer eyJ0eXA*****"
+```
+
+#### Response
+HTTP status code `200` if the operation is successful.
\ No newline at end of file
diff --git a/_mydocs/api/licensing/me.md b/_mydocs/api/licensing/me.md
new file mode 100644
index 0000000..015bd7f
--- /dev/null
+++ b/_mydocs/api/licensing/me.md
@@ -0,0 +1,52 @@
+---
+layout: page
+title: Me
+published: true
+order: /0
+---
+The `Me` object contains information about the license manager, including the number of available license pools, the total number of licenses, and the breakdown of transferable vs. untransferable licenses. Additionally, it lists the domains that are authorized for assigning transferable licenses.
+
+## Endpoints
+
+`GET https://www.sqlbi.com/api/licensing/v1/me`
+
+> The endpoint is authenticated using a bearer token. The token must be included in the *Authorization* header of the request. See more in the [Authentication](index#authentication) section.
+
+### `GET` / v1 / me
+Retrieve the license manager's details. Here is how to make this request using curl:
+
+```bash
+curl -X GET "https://www.sqlbi.com/api/licensing/v1/me" \
+ -H "Authorization: Bearer eyJ0eXA*****"
+```
+
+#### Response
+Upon a successful request, the API will return a JSON object containing the details about the license manager. Below is an example of a JSON response:
+
+```json
+// License Manager #99999
+{
+ "id": 99999,
+ "name": "SQLBI",
+ "email": "info@sqlbi.com",
+ "pools": 13,
+ "licenses": 28,
+ "untrasferableLicenses": 24,
+ "transferableLicenses": 4,
+ "allowedDomainsForTransferableLicenses": [
+ "sqlbi.com"
+ ]
+}
+```
+
+#### Response Fields
+
+- `id`: The unique identifier of the license manager.
+- `name`: The name of the organization or individual managing the licenses.
+- `email`: The email address of the license manager.
+- `pools`: Number of license pools owned by the license manager.
+- `licenses`: The total number of licenses purchased.
+- `untransferableLicenses`: The number of untransferable licenses.
+- `transferableLicenses`: The number of transferable licenses.
+- `allowedDomainsForTransferableLicenses`: A list of domains allowed for assigning transferable licenses.
+> While untransferable licenses can be assigned to any email address, transferable licenses can only be assigned to email addresses with domains listed here.
\ No newline at end of file
diff --git a/_mydocs/api/licensing/pools.md b/_mydocs/api/licensing/pools.md
new file mode 100644
index 0000000..b04b4c8
--- /dev/null
+++ b/_mydocs/api/licensing/pools.md
@@ -0,0 +1,168 @@
+---
+layout: page
+title: Pools
+published: true
+order: /2
+---
+The `Pool` object represent the sets of licenses purchased for specific SQLBI courses. It details the number of total, assigned, and available licenses, along with their transferability and validity period.
+
+Each pool is associated with a specific course. When a license is assigned to a user, it is taken from the pool's available licenses count. If the pool is transferable, the license can be returned to the pool. When this happens, the license becomes inactive and the pool's available licenses count is incremented. If the pool is not transferable, the license cannot be returned to the pool.
+
+## Endpoints
+
+`GET https://www.sqlbi.com/api/licensing/v1/pools`
+
+`GET https://www.sqlbi.com/api/licensing/v1/pool/{id}`
+
+`GET https://www.sqlbi.com/api/licensing/v1/pool/{id}/licenses`
+
+`POST https://www.sqlbi.com/api/licensing/v1/pool/{id}/license`
+
+> Each endpoint is authenticated using a bearer token. The token must be included in the *Authorization* header of the request. See more in the [Authentication](index#authentication) section.
+
+
+### `GET` / v1 / pools
+Retrieve information about all license pools. Here is how to make this request using curl:
+
+```bash
+curl -X GET "https://www.sqlbi.com/api/licensing/v1/pools" \
+ -H "Authorization: Bearer eyJ0eXA*****"
+```
+
+#### Response
+A JSON array of objects, each representing a license pool. See the `Pool` object response below for more details.
+
+#### Response Fields
+See the `Pool` object fields below for a description of each field.
+
+
+### `GET` / v1 / pool / {id}
+Retrieve detailed information about a specific license pool by providing the pool ID:
+
+```bash
+curl -X GET "https://www.sqlbi.com/api/licensing/v1/pool/21" \
+ -H "Authorization: Bearer eyJ0eXA*****"
+```
+
+#### Response
+A JSON object detailing the specific license pool, including the course information and licensing details.
+
+```json
+// Pool #21
+{
+ "id": "21",
+ "course": {
+ "id": "37571",
+ "title": "Mastering DAX Video Course"
+ },
+ "start": "2022-11-13T19:46:06+00:00",
+ "end": "2025-11-13T00:00:00+00:00",
+ "transferable": false,
+ "licenses": 10,
+ "assignedLicenses": 1,
+ "availableLicenses": 9
+}
+```
+
+#### Response Fields
+Each `Pool` object contains the following fields:
+
+- `id`: The unique identifier for the license pool.
+- `course`: An object containing:
+ - `id`: The unique course identifier.
+ - `title`: The name of the course.
+- `start`: The start date and time of the license validity period in ISO 8601 format.
+- `end`: The end date and time of the license validity period in ISO 8601 format.
+- `transferable`: A boolean indicating whether the licenses in this pool are transferable (true) or untrasferable (false). [See the difference](https://www.sqlbi.com/transferable-video-course-licenses/).
+- `licenses`: The total number of licenses within the pool.
+- `assignedLicenses`: The number of licenses that have been assigned to students.
+- `availableLicenses`: The number of licenses remaining in the pool that can be assigned to new students.
+
+
+### `GET` / v1 / pool / {id} / licenses
+Retrieve a list of assigned licenses within a specific pool. Supports pagination and filtering inactive licenses.
+
+```bash
+curl -X GET "https://www.sqlbi.com/api/licensing/v1/pool/26/licenses" \
+ -H "Authorization: Bearer eyJ0eXA*****"
+```
+
+#### Query Parameters
+
+- `page`: (Optional) The page number to retrieve. Default is `1`.
+- `pageSize`: (Optional) The number of licenses to retrieve per page. Default is `10`.
+- `includeInactive`: (Optional) Whether to include inactive licenses in the response. Default is `false`.
+
+#### Response
+A JSON array of objects, each representing a license. For example:
+
+```json
+[
+ // License #29
+ {
+ "id": "29",
+ "poolId": "26",
+ "courseId": "51030",
+ "start": "2024-04-17T15:23:08+00:00",
+ "end": "2025-01-01T00:00:00+00:00",
+ "active": true,
+ "revokable": true,
+ "editable": true,
+ "student": {
+ "id": "16521",
+ "name": "Student",
+ "email": "student@sqlbi.com"
+ }
+ },
+ ... // Additional licenses
+]
+```
+
+#### Response Fields
+See the `License` object fields in the [Licenses](licenses) section for a description of each field.
+
+
+### `POST` / v1 / pool / {id} / license
+Assign a license from the specified pool to a student. Note that:
+- If the target student does not exist in the system, a new student will be created.
+- If the target student is already enrolled in the course, the operation will fail.
+- If the `endDate` is not specified, the license will expire at the pool expiration date.
+- If you do not have enough available licenses, the operation will fail, unless you set `recycle` to `true`. In this case (and only if the pool contains transferable licenses), the oldest assigned license in the pool will be revoked and a new one assigned to the target student.
+
+```bash
+curl -X POST "https://www.sqlbi.com/api/licensing/v1/pool/12/license" \
+ -H "Authorization: Bearer eyJ0eXA*****" \
+ -H "Content-Type: application/json" \
+ -d '{"email": "student@sqlbi.com", "endDate": "2024-05-01"}'
+```
+
+#### Request Body
+
+- `email`: The email address of the student to assign the license to.
+- `name`: (Optional) The name of the student to assign the license to. If not provided and the student is not found in the system, the name will be set to *Student*.
+- `endDate`: (Optional) The expiration date of the license in `YYYY-MM-DD` format.
+- `recycle`: (Optional) A boolean indicating whether to recycle an existing license if no available licenses are present. Default is `false`.
+
+#### Response
+A JSON object representing the assigned license. For example:
+
+```json
+{
+ "id": 38, // New license ID
+ "poolId": 12,
+ "courseId": "37571",
+ "start": "2024-04-19T06:36:10+00:00",
+ "end": "2024-05-01T00:00:00+00:00",
+ "active": true,
+ "revokable": true,
+ "editable": true,
+ "student": {
+ "id": 16521,
+ "name": "Student",
+ "email": "student@sqlbi.com"
+ }
+}
+```
+
+#### Response Fields
+See the `License` object fields in the [Licenses](licenses) section for a description of each field.
\ No newline at end of file
diff --git a/_mydocs/api/licensing/students.md b/_mydocs/api/licensing/students.md
new file mode 100644
index 0000000..3fb805c
--- /dev/null
+++ b/_mydocs/api/licensing/students.md
@@ -0,0 +1,115 @@
+---
+layout: page
+title: Students
+published: true
+order: /4
+---
+The `Student` object contains comprehensive details about students, including their registered courses, the status of their licenses, and their progress within each course.
+
+## Endpoints
+
+`GET https://www.sqlbi.com/api/licensing/v1/students`
+
+`GET https://www.sqlbi.com/api/licensing/v1/student`
+
+> Each endpoint is authenticated using a bearer token. The token must be included in the *Authorization* header of the request. See more in the [Authentication](index#authentication) section.
+
+
+### `GET` / v1 / students
+Retrieve a list of all students managed by the license manager. Supports pagination and filtering inactive licenses.
+
+```bash
+curl -X GET "https://www.sqlbi.com/api/licensing/v1/students?page=2" \
+ -H "Authorization: Bearer eyJ0eXA*****"
+```
+
+#### Query Parameters
+
+- `page`: (Optional) The page number to retrieve. Default is `1`.
+- `pageSize`: (Optional) The number of licenses to retrieve per page. Default is `10`.
+- `includeInactive`: (Optional) Whether to include inactive courses in the response. Default is `false`.
+
+
+#### Response
+A JSON array of student objects, each containing details about their registered courses and licenses. See the `Student` object response below for more details.
+
+### `GET` / v1 / student
+Retrieve detailed information about a specific student managed by you by using either their email address or user ID as a query parameter. This allows for flexible student lookup depending on available data.
+
+```bash
+# Query by email address
+curl -X GET "https://www.sqlbi.com/api/licensing/v1/student?email=student@sqlbi.com" \
+ -H "Authorization: Bearer eyJ0eXA*****"
+
+
+# Query by user ID
+curl -X GET "https://www.sqlbi.com/api/licensing/v1/student?id=16521" \
+ -H "Authorization: Bearer eyJ0eXA*****"
+```
+
+#### Query Parameters
+- `email`: (Optional) The email address of the student to query.
+- `id`: (Optional) The unique identifier of the student to query.
+- `includeInactive`: (Optional) Whether to include inactive courses in the response. Default is `false`.
+
+> At least one between `email` and `id` must be provided.
+
+#### Response
+A JSON object detailing the specific student, including comprehensive course and license information.
+
+```json
+// Student #16521
+{
+ "id": 16521,
+ "name": "Student",
+ "email": "student@sqlbi.com",
+ "courses": [
+ {
+ "id": "718435",
+ "title": "SQLBI+",
+ "poolId": 33,
+ "licenseId": 31,
+ "licenseActive": true,
+ "licenseRevokable": false,
+ "licenseEditable": false,
+ "start": "2024-04-18T06:48:42+00:00",
+ "end": "2024-10-29T07:16:28+00:00",
+ "progress": 50,
+ "completed": null
+ },
+ {
+ "id": "65104",
+ "title": "Data Modeling for Power BI Video Course",
+ "poolId": 37,
+ "licenseId": 32,
+ "licenseActive": true,
+ "licenseRevokable": false,
+ "licenseEditable": false,
+ "start": "2024-04-10T06:50:09+00:00",
+ "end": "2027-04-18T00:00:00+00:00",
+ "progress": 100,
+ "completed": "2024-04-18T01:07:00+00:00"
+ },
+ ... // Additional courses
+ ]
+}
+```
+
+#### Response Fields
+Each `Student` object contains the following fields:
+
+- `id`: Unique identifier for the student.
+- `name`: Name of the student.
+- `email`: Email address of the student.
+- `courses`: An array of course objects associated with the student, each containing:
+ - `id`: The course ID.
+ - `title`: The title of the course.
+ - `poolId`: Identifier for the license pool from which the license is assigned.
+ - `licenseId`: Identifier for the specific license.
+ - `licenseActive`: Boolean indicating if the license is currently active.
+ - `licenseRevokable`: Boolean indicating if the license can be revoked.
+ - `licenseEditable`: Boolean indicating if the license expiration date can be edited.
+ - `start`: The start date of the license in ISO 8601 format.
+ - `end`: The expiration date of the license in ISO 8601 format.
+ - `progress`: Percentage of course completion by the student.
+ - `completed`: The completion date of the course in ISO 8601 format, if applicable.
diff --git a/_mydocs/bravo/index.md b/_mydocs/bravo/index.md
index 28d2774..4d15bec 100644
--- a/_mydocs/bravo/index.md
+++ b/_mydocs/bravo/index.md
@@ -1,5 +1,5 @@
---
-layout: home
+layout: page
title: Bravo for Power BI
published: true
order: /bravo
diff --git a/_mydocs/contoso-data-generator/databasegenerator.md b/_mydocs/contoso-data-generator/databasegenerator.md
index dba917f..395cc9b 100644
--- a/_mydocs/contoso-data-generator/databasegenerator.md
+++ b/_mydocs/contoso-data-generator/databasegenerator.md
@@ -10,7 +10,10 @@ The DatabaseGenerator.exe is a tool to generate orders for the Contoso data mode
## Overview and usage
The DatabaseGenerator.exe is a command-line application, running on .NET Core 3.1. It requires a working folder to run on, containing a configuration file and data input files. After executing, the working folder also contains generated output data files and logs.
-Usage: `databasegenerator.exe inputfolder outputfolder configfile [param:OrdersCount=nnnnnnn]`
+Usage:
+```bash
+databasegenerator.exe inputfolder outputfolder configfile [param:OrdersCount=nnnnnnn]
+```
Input files:
- config.json : main app configuration
diff --git a/_mydocs/contoso-data-generator/index.md b/_mydocs/contoso-data-generator/index.md
index 14d6abe..c9dc455 100644
--- a/_mydocs/contoso-data-generator/index.md
+++ b/_mydocs/contoso-data-generator/index.md
@@ -1,5 +1,5 @@
---
-layout: home
+layout: page
title: Contoso Data Generator
menu_title: Contoso Data Generator
published: true
diff --git a/_mydocs/dax-internals/index.md b/_mydocs/dax-internals/index.md
index d6d0d85..2b003c9 100644
--- a/_mydocs/dax-internals/index.md
+++ b/_mydocs/dax-internals/index.md
@@ -1,5 +1,5 @@
---
-layout: home
+layout: page
title: DAX Internals
published: true
order: /dax-internals
diff --git a/_mydocs/dax-template/configuration/definitions/holidays-definition.md b/_mydocs/dax-template/configuration/definitions/holidays-definition.md
index 4e0e4af..521626d 100644
--- a/_mydocs/dax-template/configuration/definitions/holidays-definition.md
+++ b/_mydocs/dax-template/configuration/definitions/holidays-definition.md
@@ -7,7 +7,7 @@ order: /
The HolidaysDefinition template use the following definition to create a HolidaysDefinition table.
-~~~
+```json
"Holidays": [
{
"IsoCountry": "US",
@@ -21,7 +21,7 @@ The HolidaysDefinition template use the following definition to create a Holiday
"ConflictPriority": 100
},
...
-~~~
+```
## Holidays
Array of holidays, each defined as follows.
diff --git a/_mydocs/dax-template/configuration/definitions/language.md b/_mydocs/dax-template/configuration/definitions/language.md
index c1e7146..6bff2fc 100644
--- a/_mydocs/dax-template/configuration/definitions/language.md
+++ b/_mydocs/dax-template/configuration/definitions/language.md
@@ -6,7 +6,7 @@ order: /
---
Defines the translations for one template.
-~~~
+```json
{
"Iso": "it",
"Table": {...},
@@ -14,20 +14,20 @@ Defines the translations for one template.
"Hierarchies": [...],
"Measures": [...]
}
-~~~
+```
## Iso
Defines the ISO code of the localization, e.g. en-US.
## Table
Defines the localization of a table. It is unusual to translate a table in Bravo because the user can customize the table name.
-~~~
+```json
"Table": {
"OriginalName": null,
"Name": "",
"Description": ""
}
-~~~
+```
### OriginalName
Original table name.
@@ -39,7 +39,7 @@ Localized table description.
## Measures
Array of objects defining the localization of a measure. Each object has the following properties.
-~~~
+```json
"Measures": [
{
"OriginalName": "Last Transaction Date",
@@ -50,7 +50,7 @@ Array of objects defining the localization of a measure. Each object has the fol
},
...
]
-~~~
+```
### OriginalName
Original measure name.
### Name
@@ -66,7 +66,7 @@ Localized format string of the measure.
## Columns
Array of objects defining the localization of a column. Each object has the following properties.
-~~~
+```json
"Columns": [
{
"OriginalName": "Year Month",
@@ -76,7 +76,7 @@ Array of objects defining the localization of a column. Each object has the foll
},
...
]
-~~~
+```
### OriginalName
Original column name.
@@ -91,7 +91,7 @@ Localized format string of the column.
## Hierarchies
Array of objects defining the localization of a hierarchy. Each object has the following properties.
-~~~
+```json
"Hierarchies": [
{
"OriginalName": "Fiscal",
@@ -118,7 +118,7 @@ Array of objects defining the localization of a hierarchy. Each object has the f
},
...
]
-~~~
+```
### OriginalName
Original hierarchy name.
diff --git a/_mydocs/dax-template/configuration/definitions/translation-definition.md b/_mydocs/dax-template/configuration/definitions/translation-definition.md
index 7d52143..77b9f79 100644
--- a/_mydocs/dax-template/configuration/definitions/translation-definition.md
+++ b/_mydocs/dax-template/configuration/definitions/translation-definition.md
@@ -7,7 +7,7 @@ order: /
A single Translation.Definition object includes an array for all the available translations.
-~~~
+```json
"Translations": [
{
"Iso": "it",
@@ -18,7 +18,7 @@ A single Translation.Definition object includes an array for all the available t
},
...
]
-~~~
+```
## Translations
Array of [Language](./language.md) objects, one for each supported ISO localization.
diff --git a/_mydocs/dax-template/index.md b/_mydocs/dax-template/index.md
index eb7b673..d1ec8a2 100644
--- a/_mydocs/dax-template/index.md
+++ b/_mydocs/dax-template/index.md
@@ -1,5 +1,5 @@
---
-layout: home
+layout: page
title: Dax Template
published: true
order: /dax-template
diff --git a/_mydocs/vertipaq-analyzer/index.md b/_mydocs/vertipaq-analyzer/index.md
index a382b0e..ffbe7ae 100644
--- a/_mydocs/vertipaq-analyzer/index.md
+++ b/_mydocs/vertipaq-analyzer/index.md
@@ -1,5 +1,5 @@
---
-layout: home
+layout: page
title: VertiPaq Analyzer
published: true
order: /vertipaq-analyzer
diff --git a/_mydocs/www/images/license-manager-api.png b/_mydocs/www/images/license-manager-api.png
new file mode 100644
index 0000000..7c533a4
Binary files /dev/null and b/_mydocs/www/images/license-manager-api.png differ
diff --git a/_mydocs/www/images/license-manager-create-token.png b/_mydocs/www/images/license-manager-create-token.png
new file mode 100644
index 0000000..4480654
Binary files /dev/null and b/_mydocs/www/images/license-manager-create-token.png differ
diff --git a/_mydocs/www/images/license-manager-delete-token.png b/_mydocs/www/images/license-manager-delete-token.png
new file mode 100644
index 0000000..1188672
Binary files /dev/null and b/_mydocs/www/images/license-manager-delete-token.png differ
diff --git a/_mydocs/www/images/license-manager-guide-1.png b/_mydocs/www/images/license-manager-guide-1.png
new file mode 100644
index 0000000..b633e8f
Binary files /dev/null and b/_mydocs/www/images/license-manager-guide-1.png differ
diff --git a/_mydocs/www/images/license-manager-guide-10.png b/_mydocs/www/images/license-manager-guide-10.png
new file mode 100755
index 0000000..5edd208
Binary files /dev/null and b/_mydocs/www/images/license-manager-guide-10.png differ
diff --git a/_mydocs/www/images/license-manager-guide-11.png b/_mydocs/www/images/license-manager-guide-11.png
new file mode 100755
index 0000000..764ead2
Binary files /dev/null and b/_mydocs/www/images/license-manager-guide-11.png differ
diff --git a/_mydocs/www/images/license-manager-guide-2.png b/_mydocs/www/images/license-manager-guide-2.png
new file mode 100755
index 0000000..2af6e29
Binary files /dev/null and b/_mydocs/www/images/license-manager-guide-2.png differ
diff --git a/_mydocs/www/images/license-manager-guide-3.png b/_mydocs/www/images/license-manager-guide-3.png
new file mode 100755
index 0000000..e7bf744
Binary files /dev/null and b/_mydocs/www/images/license-manager-guide-3.png differ
diff --git a/_mydocs/www/images/license-manager-guide-4.png b/_mydocs/www/images/license-manager-guide-4.png
new file mode 100755
index 0000000..cc0f3f5
Binary files /dev/null and b/_mydocs/www/images/license-manager-guide-4.png differ
diff --git a/_mydocs/www/images/license-manager-guide-5.png b/_mydocs/www/images/license-manager-guide-5.png
new file mode 100755
index 0000000..abda4fc
Binary files /dev/null and b/_mydocs/www/images/license-manager-guide-5.png differ
diff --git a/_mydocs/www/images/license-manager-guide-6.png b/_mydocs/www/images/license-manager-guide-6.png
new file mode 100755
index 0000000..bf70e17
Binary files /dev/null and b/_mydocs/www/images/license-manager-guide-6.png differ
diff --git a/_mydocs/www/images/license-manager-guide-7.png b/_mydocs/www/images/license-manager-guide-7.png
new file mode 100755
index 0000000..09d9179
Binary files /dev/null and b/_mydocs/www/images/license-manager-guide-7.png differ
diff --git a/_mydocs/www/images/license-manager-guide-8.png b/_mydocs/www/images/license-manager-guide-8.png
new file mode 100755
index 0000000..7161803
Binary files /dev/null and b/_mydocs/www/images/license-manager-guide-8.png differ
diff --git a/_mydocs/www/images/license-manager-guide-9.png b/_mydocs/www/images/license-manager-guide-9.png
new file mode 100755
index 0000000..d500efb
Binary files /dev/null and b/_mydocs/www/images/license-manager-guide-9.png differ
diff --git a/_mydocs/www/index.md b/_mydocs/www/index.md
new file mode 100644
index 0000000..f141ae2
--- /dev/null
+++ b/_mydocs/www/index.md
@@ -0,0 +1,8 @@
+---
+layout: page
+title: SQLBI Website
+published: true
+order: /zzz
+next_reading: true
+---
+This section contains the documentation of features and services available on the SQLBI website.
\ No newline at end of file
diff --git a/_mydocs/www/license-manager.md b/_mydocs/www/license-manager.md
new file mode 100644
index 0000000..eae3287
--- /dev/null
+++ b/_mydocs/www/license-manager.md
@@ -0,0 +1,115 @@
+---
+layout: page
+title: License Manager Guide
+menu_title: License Manager
+published: true
+order: /license-manager
+---
+SQLBI provides on-demand video courses and other paid content with transferable or untransferable licenses - [see the difference](licensing).
+
+By purchasing some products with a transferable license, you can access a special area of your account dashboard to manage the licenses and assign/revoke the access of your team to the products you purchased.
+
+This guide explains:
+- How to assign and revoke your licenses.
+- How to use the auto-enrollment links, which are a convenient way to automate the management of large teams.
+- How to generate authentication tokens for our licensing API.
+
+> Do not hesitate to email us at [info@sqlbi.com](mailto:info@sqlbi.com) if you have questions that fall out of the scope of this guide, or if any typos are preventing your users from receiving their credentials.
+
+## Access the License Manager
+To access the License Manager, you need to have purchased a product with a transferable license. If you have purchased a product with a transferable license, you can access the License Manager by following these steps:
+
+1. [Log into your account](https://www.sqlbi.com/account/).
+2. Go to your **Licenses** section.
+
+
+
+## Assign Licenses
+You can assign your licenses by following these steps:
+
+1. Go to the **Licenses** section.
+
+2. Here you see the list of products that you have purchased licenses for. You may have purchased Transferable or Untransferable licenses – this will be indicated under the title of each product title. Licenses are grouped in pools.
+
+
+3. Click on the **Assign** button. The dialog box below pops up.
+
+
+4. The expiry date under **Licenses pool** reflects the date of purchase, not the date the course is assigned. This window combines together both your Transferable and Untransferable license pools.
+
+5. Pick the license pool you wish to assign from the drop down and enter the user's information.
+
+
+6. Click on **Assign License**. An email is automatically sent to the user with their login details.
+
+## Revoke Licenses
+You can revoke a transferable license by following these steps:
+
+1. Go to the **Users** section to see the list of users that have had a license assigned to them directly.
+
+
+2. You see the progress they have made (in case the content is a video course), and you can expand for more information.
+
+
+3. In case the user has a transferable license assigned, you can revoke it by pressing the **Revoke** button. The system will send an email informing the user that they no longer have access to the licensed content, and it frees the license to be assigned to someone else.
+
+
+## Auto-Enrollment Links
+In your account area there is a section that allows you to create auto-enrollment links. These are special links that users can use to have one of your licenses automatically assigned to them.
+
+
+
+Using auto-enrollment links provides different benefits depending on the [type of license](licensing) you have purchased:
+
+- **Untransferable licenses:** the auto-enrollment link allows you to let users register on their own. Useful if you purchase a high number of licenses and have not assigned them yet at the time of purchase. The license remains theirs until it expires.
+
+- **Transferable licenses:** auto-enrollment links enable you to create a “library” that users borrow licenses from and return licenses to. The license manager has the option to:
+
+ - Enforce the returning of the licenses for someone else to use;
+ - Enforce the reassignment of a license to someone else after a certain period of time;
+ - Auto-Reassign: once all the licenses have been assigned, if someone new applies for a license this will revoke the oldest license in use and assign it to the new user.
+
+You can create auto-enrollment links by following these steps:
+
+1. Go to the **Links** section.
+
+2. Click on **Create Link**. This opens the following pop-up.
+
+
+3. In the drop-down, decide which pool you want to pick these licenses from.
+
+We are focusing on Transferable Licenses for the purpose of this guide. This is where you customize your library. You decide how many licenses you are making available, for how long, and whether you want them to roll over from the oldest user in the queue to the newest, entering user. These are details you will need to communicate with users when making the link available to them.
+
+4. Click **Create Link**.
+
+5. You now have a link to send out to your team members. With Transferable Licenses, each time you create an auto-enrollment link you create a customized “library”.
+
+6. Users who receive that link will be able to either create an account on on SQLBI or log into their existing account, and find the license available in their profile. This link and thus the library that it represents can be destroyed by clicking **Delete**.
+
+
+
+## Tokens for Licensing API
+
+The [SQLBI Licensing API](../api/licensing/index) allows you to programmatically manage your licenses and students. To utilize the API, you must first generate an API token through the SQLBI License Manager interface. Here is a step-by-step guide to creating a new API token:
+
+1. Go to the **API** section.
+
+
+2. Click on the **Create New Token** button to begin the process of generating a new token.
+
+In the *Create API Token* window, you will be prompted to give your token a name. This name is for your reference and will help you identify the token later. Please note that once set, the token name cannot be changed. A long string will be automatically generated; this is your API token. It is a JSON Web Token (JWT) that will be used to authenticate your API requests.
+
+3. It is crucial to save your API token in a secure place immediately, as **it will only be shown once for security reasons**. If you lose this token, you will need to generate a new one.
+
+4. After saving the token, click the **Create** button to finalize the creation process.
+
+> Remember to keep your API tokens confidential and use them securely, as they grant access to your SQLBI licensing information.
+
+Once created, your new API token will appear in the list of tokens. You can create multiple tokens if needed and delete any that are no longer required by clicking the **Delete** button next to the corresponding one.
+
+
+
+
+
+
+Now you are ready to use the [SQLBI Licensing API](../api/licensing/index).
diff --git a/_mydocs/www/licensing.md b/_mydocs/www/licensing.md
new file mode 100644
index 0000000..172e443
--- /dev/null
+++ b/_mydocs/www/licensing.md
@@ -0,0 +1,48 @@
+---
+layout: page
+title: SQLBI Licensing
+menu_title: Licensing
+published: true
+order: /license
+---
+
+At SQLBI, we provide comprehensive licensing options for our video courses and subscriptions, ensuring flexibility and convenience for both individual learners and organizations. Our licenses are designed to cater to different needs, making it easier for license managers to allocate, manage, and optimize access to our premium content.
+
+A license is to be considered a personal authorization to consume premium content, has a duration, and must be assigned to a user, even temporarily, in order to be used. Licenses are either transferable or untransferable.
+
+## Untransferable Licenses
+Untransferable licenses are licenses that can only be assigned to one person at all. You do not have to assign them to a user at the time of purchase. This is something you can do from your dashboard later on, as the license manager. This is useful if you aren't sure who needs the license just yet at the time of purchase, or if you're mixing and matching differnet amounts of different courses.
+
+One great, new feature of our untransferable licenses is that you can delegate the assignment of the licenses to the users themselves by creating an auto-enrollment link that you send out. That can represent a significant time saving for you as the license manager, if you purchase a large number of licenses and don't want to be entering everyone's details yourself.
+
+
+## Transferable Licenses
+Transferable licenses are licenses that can be passed from user to user as many times as you want, throughout the license's entire lifespan. Only one user can use a license at any given time.
+
+One feature we have made available, is the ability for the license manager to create and entirely customize a library for the users. **Users can *borrow* and *return* transferable licenses, an unlimited amount of times.** This can greatly reduce your cost of training – keep your transferable license working hard!
+
+As you customize the library, you fully control whom the licenses are assigned to, when a license is revoked and re-assigned, you can follow your students' progress (in case of video courses), you can set the duration of availability of a license, you can even enable users to enroll themselves to keep the license moving forward around your team.
+
+
+
+## Features Comparison
+
+| | Untransferable | Transferable |
+|---|:---:|:---:|
+| **Duration
(video courses)** | 36 months | 36 months |
+| **Duration
(subscriptions)** | 12 months
*(auto renewed)* | 12 months
*(auto renewed)* |
+| **Access** | Full, uninterrupted over license lifetime | As long as a user has the license assigned to them, then they lose access once it is revoked |
+| **Supervision of progress (video courses)** | Yes\* | Yes |
+| **Can be reassigned** | | Yes |
+| **Can manage programmatically (API)** | | Yes |
+| **Total no. of users per license**| 1 | Unlimited transfers |
+| **Concurrent users at any given time** | One per license purchased|One per license assigned |
+|-|-|-|
+
+*\* This feature is available only if you opt to assign a license at a later time during the purchase process, without immediately identifying the intended student.*
+
+## License Manager
+
+The License Manager is a web interface that allows you to manage your licenses, students, and courses. It is the central hub for all your licensing needs, providing you with the tools to assign, revoke, and monitor licenses, as well as track student progress and manage course enrollments.
+
+For more information on how to use it, please refer to our [License Manager Guide](license-manager).