> For the complete documentation index, see [llms.txt](https://developerdocs.instructure.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://developerdocs.instructure.com/services/dap/dataset/dataset-additional-notes.md).

# Additional Notes

Additional notes to the datasets.

## Understanding the `tab_configuration` Column in the Courses Table in Canvas Namespace

There have been several questions around the `tab_configuration` column in the **CD2 courses table**, and this note want to clarify how it works and what the values represent. This additional context should help improve understanding and make it easier to work with this data.

### Mapping of `id` Values to Tabs

The latest list of tab IDs can be found in the [Canvas LMS source code](https://github.com/instructure/canvas-lms/blob/4ec7485b1b20513ec9335aa61f5ee0a68a5c3503/app/models/course.rb#L3174C3-L3194C18). Here’s the 2025-02-14 version:

| `id` | Tab Name             |
| ---- | -------------------- |
| 0    | Home                 |
| 1    | Syllabus             |
| 2    | Pages                |
| 3    | Assignments          |
| 4    | Quizzes              |
| 5    | Grades               |
| 6    | People               |
| 7    | Groups               |
| 8    | Discussions          |
| 10   | Modules              |
| 11   | Files                |
| 12   | Conferences          |
| 13   | Settings             |
| 14   | Announcements        |
| 15   | Outcomes             |
| 16   | Collaborations       |
| 17   | Collaborations (New) |
| 18   | Rubrics              |
| 19   | Schedule             |
| 20   | Course Paces         |
| 21   | Search               |

### Example JSON in `tab_configuration` Column:

```json
[
  { "id": 0 },
  { "id": "context_external_tool_8923" },
  { "id": 14, "hidden": true },
  { "id": 5, "hidden": true },
  { "id": 1, "hidden": false }
]
```

### Example Interpretation:

* `"id": 3` refers to the **Assignments** tab.
* `"id": "context_external_tool_8923"` refers to an **LTI app** (in this case, **Studio**). You can look up this `id` in the **`context_external_tools`** table to retrieve its friendly name from the `name` column.

#### Logic Behind Tab Visibility

While the `tab_configuration` column provides raw data, it’s important to note that there is **significant logic in the Canvas LMS** that determines whether these tabs are actually visible to a specific user. This logic depends on various factors, such as user roles and permissions.

#### Understanding `hidden: true/false`

* `"hidden": true` means the tab is currently **not visible** in the course interface.
* `"hidden": false` (or if `hidden` is not present) means the tab is **visible**.

***

## Connecting Learning Outcomes with Learning Outcome Groups

To connect **`learning_outcomes`** with their respective **`learning_outcome_groups`**, you should utilize the `content_tags` table. Below is guidance and examples to clarify how these associations work.

### Key to the Association:

The relationship between `learning_outcomes` and `learning_outcome_groups` is established within the `content_tags` table as follows:

* If `content_tags.content_type` is `"LearningOutcome"`, then:
  * `content_tags.content_id` → `learning_outcomes.id`
* If `content_tags.associated_asset_type` is `"LearningOutcomeGroup"`, then:
  * `content_tags.associated_asset_id` → `learning_outcome_groups.id`

***

## What Are the Extra Pseudonyms That Now (2nd Half of 2025) Show up in Canvas?

The backend of the Canvas authentication system is being updated to improve its security, reliability, and performance. These updates include adding an extra Pseudonym record for each Canvas user in the [`canvas` namespaces' `pseudonyms`](/services/dap/dataset/dataset-namespaces/dataset-canvas.md) table. Initially, these pseudonyms will be inactive and not used during the user's authentication process. However, these pseudonyms will eventually be crucial in enabling new, improved, and more secure authentication methods for Instructure products. These records can be excluded from reports if they cause any issues. We apologize for any inconvenience this may cause. To filter these out use `is_inst_id` = `true` filter in your reports in the `pseudonyms` table.

***

## Stale Links in the `data-api-endpoint` Attribute of `wiki_pages.body`

There have been reports of links in the `body` column of the [`canvas` namespaces' `wiki_pages`](/services/dap/dataset/dataset-namespaces/dataset-canvas.md) table pointing at a different course or file than the page shows in the Canvas UI, which looks like incorrect data. The values CD2 delivers do match the Canvas database exactly. The stale links are confined to the `data-api-endpoint` attribute, and this note explains where they come from and which part of the HTML to rely on instead.

### Where the Attribute Comes From

Canvas adds `data-api-endpoint` (and `data-api-returntype`) to links when it returns rich content through its API, as a convenience for API consumers. The reasoning is described in [`doc/api/endpoint_attributes.md`](https://github.com/instructure/canvas-lms/blob/master/doc/api/endpoint_attributes.md) in the Canvas LMS source code. Because the Rich Content Editor loads content through that same API, the attribute is written back into the database the next time a user edits and saves the page.

Content migrations (course copy, course import, blueprint sync) rewrite the attributes that actually locate a resource, such as `href` on a link and `src` on an image or iframe. They do not rewrite `data-api-endpoint`, and Canvas does not use it for rendering. After a course copy, the attribute therefore keeps referring to the **course, user and file IDs of the source course**, while the `href` next to it correctly refers to the new course.

This also explains why the behavior is difficult to reproduce on demand: the attribute is only present if the content was saved again after Canvas added it, and Canvas only adds it to links it can map to an API route, which currently covers files, pages, assignments, discussion topics, quizzes, modules and LTI tool launches.

### Example

A `wiki_pages.body` value on a page that was copied from another course:

```html
<p><a class="instructure_file_link instructure_scribd_file auto_open" title="Link"
      href="/courses/3606038/files/274032339?wrap=1" target="_blank"
      data-canvas-previewable="true"
      data-api-endpoint="https://example.instructure.com/api/v1/users/170000003344068/files/17~1425"
      data-api-returntype="File">10.1.docx</a></p>
```

The `href` refers to the current course, while `data-api-endpoint` still refers to the course the page was copied from.

### Recommendations

* Treat `href` and `src` as the authoritative reference to a file, page or media object. They hold Canvas-relative paths that can be resolved against the `attachments`, `wiki_pages` and related tables.
* Ignore `data-api-endpoint` and `data-api-returntype` when extracting links. They are display-time metadata, they are not maintained across content migrations, and they are absent unless the content was re-saved.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://developerdocs.instructure.com/services/dap/dataset/dataset-additional-notes.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
