TimeBack Analytics Documentation
Overview
This document provides a comprehensive catalog of all analytical views available in the TimeBack platform's AWS QuickSight environment. Each view is designed to support specific analytical use cases while maintaining consistency, performance, and data governance standards across the analytics environment.
Data Sources:
- Staging: analytics_staging schema
- Production: analytics_production schema
Available Views
The following views are available in the TimeBack QuickSight environment, as part of the above data source and schema. Each view is documented with its purpose, available fields, and recommended join keys for cross-view analysis. Under the subtabs of this section, you will find the available views. You can link them together as needed in your own data sets.
Aggregated Session Attempts
Purpose
Provides session-level aggregated metrics for student attempts on learning resources. This dataset summarizes student performance within each session by counting total questions answered, questions answered correctly, and average attempt duration. It enables analysis of session-level engagement patterns and performance trends across students and time periods. One row per session+student. It has no subject, grade, or learning-app dimension; it summarizes question attempts per session and student only.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| session_id | String | Identifier of the learning session being summarized, a UUID. Never null; together with student_id it forms the grain, one row per session+student. Join with the Sessions dataset on session_id. Example: '6e5d4c3b-2a19-4087-9f6e-5d4c3b2a1908'. |
| student_id | String | Identifier of the student whose attempts in the session are summarized, a UUID. Never null. Join with the Students dataset on student_id. Example: 'a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d'. |
| date | Date | Calendar date of the session's first attempt, derived from the earliest attempt start time. Null only when no attempt in the session has a start timestamp. Example: '2026-03-14'. |
| total_questions_answered | Integer | Count of questions the student answered in the session (attempts that produced a score, correct or not). Never null; zero when no scored question was answered, and always greater than or equal to total_questions_correct. Example: 12. |
| total_questions_correct | Integer | Count of questions the student answered correctly in the session (score given equals max score). Never null; zero when none were correct, and never exceeds total_questions_answered. Example: 9. |
| avg_duration_sec | Decimal | Average attempt duration in whole seconds across the session's question attempts, rounded; uses client-provided duration when present, otherwise computed from start and end times. Null when no attempt has a usable duration. Example: 38. |
| org_ids | String | Array of UUIDs of the organizations this row is visible under: the student's organizations (from one_roster_role) intersected with the caller's allowed scope. Drives org-scoped row filtering: the view is fail-closed, so when the app.allowed_org_ids session setting is unset the view returns no rows, and when it is set only rows whose organizations intersect it are returned. The emitted array is that intersection, so it never exceeds the caller's scope and may be a subset of the student's full membership (and may be empty for an internal/unrestricted caller). The array itself is never null: it is the empty array {} when nothing is in scope. Used for filtering rather than as a strict join key. Example: ['2b1a0c9d-8e7f-4a6b-b5c4-d3e2f1a09b8c']. |
Join Keys
- session_id: Join with Sessions dataset to get session details and timing information
- student_id: Join with Students dataset to get student details
- org_ids: Array of organization IDs the user belongs to; used for org-scoped filtering
Attempts
Purpose
Provides detailed information about student attempts on learning resources, including timing, duration, correctness data, and session association. This dataset combines engagement metrics (for lessons and curriculum items) with performance results (for questions), enabling comprehensive analysis of both time-on-task and answer accuracy within the context of learning sessions. One row per first attempt (repeat attempts are excluded). This dataset has no subject, grade, or learning-app column of its own: a student's placed grade lives in Placement Results, and subject is not available directly here.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| student_id | String | Identifier of the student who made the attempt, a UUID from caliper_attempt.assignee_id. Never null. Join with the Students dataset on student_id. Example: 'a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d'. |
| resource_id | String | Identifier of the learning resource the attempt was on, a UUID from caliper_attempt.assignable_id. Never null. The resource may be a lesson, test, question, or other assignable content, so join the matching content dataset (Questions, Tests, Lessons, ...) by type; this dataset has no subject or grade column. Example: '7f3a2b1c-9d8e-4f6a-b5c4-d3e2f1a09b8c'. |
| session_id | String | Identifier of the learning session the attempt belongs to, resolved through the related Caliper events. Null when no session could be associated with the attempt. Join with the Sessions dataset on session_id. Example: '6e5d4c3b-2a19-4087-9f6e-5d4c3b2a1908'. |
| date | Date | Calendar date on which the attempt started, derived from start_time in the database timezone. Null only when the attempt has no start timestamp. Useful for day-level grouping of activity. Example: '2026-03-14'. |
| start_time | DateTime | Timestamp when the attempt started (when the student opened the resource). Null only when the source did not record a start; pairs with end_time to bound the attempt. Example: '2026-03-14T09:15:30Z'. |
| end_time | DateTime | Timestamp when the attempt ended (when the student finished or it closed). Null when the attempt has no recorded end, for example it is still open or was abandoned. Example: '2026-03-14T09:23:10Z'. |
| duration_sec | Decimal | Attempt duration in whole seconds: the client-provided duration when present, otherwise the difference between end_time and start_time. Null when neither a duration nor both timestamps are available. Example: 460. |
| is_correct | Boolean | Whether the attempt's answer was correct, true when the score given equals the max score and false otherwise. Null for attempts with no score, such as lesson or curriculum-item engagement rather than a graded question. Example: true. |
| org_ids | String | Array of UUIDs of the organizations this row is visible under: the student's organizations (from one_roster_role) intersected with the caller's allowed scope. Drives org-scoped row filtering: the view is fail-closed, so when the app.allowed_org_ids session setting is unset the view returns no rows, and when it is set only rows whose organizations intersect it are returned. The emitted array is that intersection, so it never exceeds the caller's scope and may be a subset of the student's full membership (and may be empty for an internal/unrestricted caller). The array itself is never null: it is the empty array {} when nothing is in scope. Used for filtering rather than as a strict join key. Example: ['2b1a0c9d-8e7f-4a6b-b5c4-d3e2f1a09b8c']. |
Join Keys
- student_id: Join with Students dataset to get student details
- resource_id: Join with Questions, Tests, Lessons, or other content datasets to get resource details (type-specific joining may be needed)
- session_id: Join with Sessions dataset to get session details and timing information
- org_ids: Array of organization IDs the user belongs to; used for org-scoped filtering
Case Courses
Purpose
Provides CASE (Competency and Academic Standards Exchange) framework course data. Each record represents a course defined in the CASE framework, sourced from cf_item rows classified as Course type, enabling analysis of CASE-backed curriculum structure and subject alignment.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| id | String | Unique identifier for the CASE course (from cf_item.identifier) |
| title | String | Full statement/title of the CASE course (from cf_item.full_statement) |
| case_subject_id | String | Unique identifier for the associated CASE subject (from cf_item_subject.subject_id, nullable if no subject mapping exists) |
Join Keys
- id: Primary key for joining with curriculum-related datasets
- case_subject_id: Join with Case Subjects dataset to get subject details
Case Subjects
Purpose
Reference (dimension) dataset of academic subjects defined in the CASE (Competency and Academic Standards Exchange) framework: one row per subject with its title, hierarchy code, and optional description. Use it to label and resolve a subject id to its name for placement, curriculum-alignment, and standards-based features. This is the canonical list of subjects, not a record of which subject a student takes: for a student's subject enrollment use Course Enrollments (its subject_ids array) or the curriculum item a mastery record points to; this dataset has no student, grade, or date columns.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| id | String | Identifier of the CASE subject, a UUID from cf_subject.identifier. Never null; it is the primary key of this reference dataset, one row per subject. Other datasets reference it as their CASE subject id (e.g. Course Enrollments.subject_ids). Example: '9c8b7a6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d'. |
| title | String | Human-readable subject name, from cf_subject.title, suitable for display and grouping. Never null. Example: 'Mathematics' (or 'Reading', 'Science'). |
| hierarchy_code | String | Publisher-designated code marking the subject's position within the CASE subject hierarchy, from cf_subject.hierarchy_code. A free-form publisher code rather than a fixed vocabulary. Never null. Example: a publisher code such as '1' or 'MATH'. |
| description | String | Optional human-readable description of the subject, from cf_subject.description. Null when the publisher supplied no description. Example: 'Mathematics, including number sense, algebra, geometry, and data analysis.' |
Join Keys
- id: Primary key for joining with placement results, Course Enrollments (subject_ids), and other CASE-framework datasets
Cheating Insights
Purpose
Provides detailed cheating insight events for learning sessions, capturing individual confirmed cheating violations with their type, timing, duration, and the per-instance description shown in the Vault. Only includes external-facing cheating insight types where is_visible is true. Insight types that require review (per insights_config) are only included if they have a TruePositive review result. Each record represents a single cheating event (e.g., Cheating: Help From Another Person, Cheating: Unauthorized App Use, Cheating: Unauthorized Device Use) identified during a session.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| session_id | String | Identifier of the session this cheating event occurred in, from insights_session.caliper_session_id. Never null. Joins to sessions.id. Example: 'urn:uuid:3f2504e0-4f89-41d3-9a0c-0305e82c3301'. |
| insight_type | String | Slug identifying the kind of cheating event, from insights_type.slug (insight types in the Cheating category with visibility = 'external'). Never null. Allowable values are CheatingHelpFromAnotherPerson, CheatingUnauthorizedAppUse, CheatingUnauthorizedDeviceUse. New cheating types may be added without code changes. Example: 'CheatingUnauthorizedAppUse'. |
| started_at_time | DateTime | Timestamp the cheating event started, in UTC ISO-8601 format, from insights_insight.started_at_time. Never null. Always ≤ ended_at_time. Named started_at_time on the insight datasets, not start_time as on the sessions dataset. Example: '2026-06-17T09:55:00.000Z'. |
| ended_at_time | DateTime | Timestamp the cheating event ended, in UTC ISO-8601 format, from insights_insight.ended_at_time. Never null. Always ≥ started_at_time. Named ended_at_time on the insight datasets, not end_time as on the sessions dataset. Example: '2026-06-17T09:55:15.000Z'. |
| duration_sec | Decimal | Duration of the cheating event in whole seconds, computed as round(extract(epoch from (ended_at_time - started_at_time))). Never null. Example: 15. |
| description | String | Per-instance contextual description of the cheating event, sourced from insights_insight.reason — the same human-readable text shown in the Vault for this insight. Never null. Example: 'Background app usage detected'. |
| org_ids | String | Array of UUIDs of the organizations this row is visible under: the session's student's organizations (from public.one_roster_role) intersected with the caller's allowed scope. Drives org-scoped row filtering: the view is fail-closed, so when the app.allowed_org_ids session setting is unset the view returns no rows, and when it is set only rows whose organizations intersect it are returned. The emitted array is that intersection, so it never exceeds the caller's scope and may be a subset of the student's full membership (and may be empty for an internal/unrestricted caller). The array itself is never null: it is the empty array {} when nothing is in scope. Each element joins to an organization id. Example: ['1a2b3c4d-1111-2222-3333-444455556666']. |
Join Keys
- session_id: Join with Sessions dataset to get session details, timing, and student information
- org_ids: Array of organization IDs the user belongs to; used for org-scoped filtering
Class Enrollments
Purpose
Links students to the classes they are enrolled in (the real OneRoster class enrollments), one row per enrollment, with the enrollment's effective dates so consumers can reconstruct class history over time. Only student-role enrollments are included. Subject and grade are exposed as arrays because the class can carry more than one of each. Use begin_date/end_date to answer point-in-time questions such as "which classes was the student enrolled in on date D".
Fields
| Field Name | Data Type | Description |
|---|---|---|
| enrollment_id | String | Unique identifier of the class enrollment, a UUID from one_roster_enrollment.id. Primary key of this dataset; never null. One row exists per student class enrollment. Example: 'b3f1c2a4-7d8e-4f10-9a2b-6c5d4e3f2a1b'. |
| student_id | String | UUID of the enrolled student, from one_roster_enrollment.user_id. Never null; only student-role enrollments are included. Joins to students.id and to student_schools.student_id. Example: '7c9e6679-7425-40de-944b-e07fc1f90ae7'. |
| class_id | String | UUID of the class the student is enrolled in, from one_roster_enrollment.class_id. Never null. Joins to classes.id. Example: '3f2504e0-4f89-41d3-9a0c-0305e82c3301'. |
| class_title | String | Human-readable title of the class, from one_roster_class.title. Never null. Example: 'Grade 4 Mathematics, Section A'. |
| course_id | String | UUID of the course this class is an offering of, from one_roster_class.course_id. Null when the class is not linked to a course. Joins to courses.id. Example: 'a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d'. |
| course_title | String | Human-readable title of the course the class belongs to, from one_roster_course.title. Null when the class has no linked course (course_id is null). Example: 'Mathematics, Grade 4'. |
| school_id | String | UUID of the school (organization) the class is held at, from one_roster_class.school_id. Null when the class records no school. Joins to schools.id. Example: '1a2b3c4d-1111-2222-3333-444455556666'. |
| school_name | String | Human-readable name of the school the class is held at, from one_roster_organization.name. Null when the class has no school (school_id is null). Example: 'Lincoln Elementary School'. |
| role | String | Enrollment role of the person, from one_roster_enrollment.role. Always 'student' in this dataset; non-student enrollments are filtered out. Never null. Example: 'student'. |
| is_primary | Boolean | Whether this is the student's primary enrollment in the class, from one_roster_enrollment.primary. True for the primary enrollment, false otherwise. Never null. Example: true. |
| begin_date | Date | Calendar date the enrollment became effective, in YYYY-MM-DD form, from one_roster_enrollment.begin_date. Null when no start date was recorded. Use with end_date for point-in-time membership. Example: '2026-08-15'. |
| end_date | Date | Calendar date the enrollment ended, in YYYY-MM-DD form, from one_roster_enrollment.end_date. Null means the enrollment is ongoing (no end recorded). Example: '2027-06-12'. |
| status | String | Lifecycle status of the enrollment, from one_roster_enrollment.status. Allowable values are 'active', 'inactive', and 'tobedeleted'. Never null. Example: 'active'. |
| subject_ids | String | Array of CASE subject UUIDs the class covers, aggregated distinctly from one_roster_class_subject. Exposed as an array because a class can carry more than one subject. Never null, but may be an empty array when the class has no subjects. Each element joins to case_subjects.id. Example: ['c1d2e3f4-1111-2222-3333-444455556666']. |
| grade_ids | String | Array of grade UUIDs the class targets, aggregated distinctly from one_roster_class_grade.placement_grade_id. Exposed as an array because a class can span more than one grade. Never null, but may be an empty array when the class has no grades. Each element joins to grades.id. Example: ['d4e5f6a7-1111-2222-3333-444455556666']. |
Join Keys
- student_id: Join with Students dataset to get student details
- class_id: Join with Classes dataset to get class details
- course_id: Join with Courses dataset to get course details
- school_id: Join with Schools dataset to get school details
- subject_ids: Array of CASE subject ids (join with Case Subjects via id)
- grade_ids: Array of grade ids (join with Grades via id)
Classes
Purpose
Lists the classes (course sections) on the platform, one row per class, so consumers can resolve a class to its course, school, subject(s) and grade(s) without joining the raw roster tables. A class is a single offering of a course at a school; its subjects and grades are exposed as arrays because a class can carry more than one of each.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| id | String | Unique identifier of the class (course section), a UUID and the primary key of this dataset. Never null. Join class-scoped datasets such as Class Enrollments on class_id. Example: 'c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e5f'. |
| title | String | Human-readable title of the class as shown to users. Null when the class has no title configured; not guaranteed unique across schools or courses. Example: 'Algebra I - Period 3'. |
| class_code | String | External or school-assigned code for the class, carried over from the source roster. Null when no code was provided; useful for reconciling against a school's own systems. Example: 'MATH-101-P3'. |
| class_type | String | Scheduling type of the class. Allowable values are 'homeroom' and 'scheduled'; null when the source did not classify the class. Example: 'scheduled'. |
| course_id | String | Identifier of the course this class is a section of, a UUID. Null when the class is not tied to a course. Join with the Courses dataset on course_id. Example: '7f3a2b1c-9d8e-4f6a-b5c4-d3e2f1a09b8c'. |
| course_title | String | Human-readable title of the course this class belongs to, copied from the Courses record. Null when there is no linked course or its title is unset; join Courses on course_id for a guaranteed value. Example: 'Algebra I'. |
| school_id | String | Identifier of the school (organization) that offers the class, a UUID. Null when the class has no school assigned. Join with the Schools dataset on id. Example: '2b1a0c9d-8e7f-4a6b-b5c4-d3e2f1a09b8c'. |
| school_name | String | Human-readable name of the school that offers the class, copied from the organization record. Null when there is no linked school or its name is unset; join Schools on school_id for a guaranteed value. Example: 'Lincoln Elementary School'. |
| status | String | Lifecycle status of the class from OneRoster. Allowable values are 'active', 'inactive', and 'tobedeleted'; treat 'tobedeleted' as soft-deleted. Never null (defaults to 'active'). Example: 'active'. |
| subject_ids | String | Array of CASE subject identifiers (UUIDs) the class covers, aggregated and de-duplicated with nulls removed. Never null but can be an empty array when no subject is mapped. Join each element with the Case Subjects dataset on id. Example: '{9c8b7a6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d}'. |
| grade_ids | String | Array of grade identifiers (UUIDs) the class targets, aggregated and de-duplicated from the class's placement grades with nulls removed. Never null but can be an empty array when no grade is set. Join each element with the Grades dataset on id. Example: '{3d2c1b0a-9f8e-4d7c-b6a5-948372615f0e}'. |
Join Keys
- id: Primary key for joining class-scoped datasets (e.g. Class Enrollments via class_id)
- course_id: Join with Courses dataset to get course details
- school_id: Join with Schools dataset to get school details
- subject_ids: Array of CASE subject ids (join with Case Subjects via id) the class covers
- grade_ids: Array of grade ids (join with Grades via id) the class targets
Course Enrollments
Purpose
Links students to the courses they are taking, rolled up from class enrollments to the course level (enrollment -> class -> course), one row per student+course. Consumers usually care which courses a student is taking rather than the individual class sections, so the section detail is collapsed. begin_date is the earliest underlying begin and end_date is the latest known end, with a null end_date meaning the course is still ongoing. This dataset exposes only school and subject arrays and has no grade dimension, so there is no grade_ids column here; for grade level use Placement Results (per subject) or the grade arrays on Classes and Class Enrollments. It likewise has no application/learning-app dimension; application activity is captured per session in Students XP and Attempts.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| student_id | String | Identifier of the student taking the course, a UUID from one_roster_enrollment.user_id (student-role enrollments only). Never null; together with course_id it forms the grain of this dataset, one row per student+course. Join with the Students dataset on student_id. Example: 'a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d'. |
| course_id | String | Identifier of the course the student is taking, a UUID derived from one_roster_class.course_id rolled up to the course level. Never null (the source filters out classes with no course). Join with the Courses dataset on course_id. Example: '7f3a2b1c-9d8e-4f6a-b5c4-d3e2f1a09b8c'. |
| course_title | String | Human-readable title of the course, copied from the Courses record. Null when the linked course is missing or has no title; join Courses on course_id when you need a guaranteed name. Example: 'Algebra I'. |
| school_ids | String | Array of school identifiers (UUIDs) at which the student takes any class for this course, aggregated and de-duplicated across the rolled-up class enrollments with nulls removed. Never null but can be an empty array when no school is recorded. Join each element with the Schools dataset on id. Example: '{2b1a0c9d-8e7f-4a6b-b5c4-d3e2f1a09b8c}'. |
| subject_ids | String | Array of CASE subject identifiers (UUIDs) covered by the course, aggregated and de-duplicated across the rolled-up classes with nulls removed. Never null but can be an empty array when the course has no subject mapping. Join each element with the Case Subjects dataset on id. Example: '{9c8b7a6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d}'. |
| begin_date | Date | Earliest begin date across the student's underlying class enrollments for this course, i.e. when the student first started the course, as a calendar date. Null when none of the underlying enrollments carry a begin date. Example: '2025-08-25'. |
| end_date | Date | Latest end date across the student's underlying class enrollments for this course, as a calendar date. Null means the course is still ongoing: it is set to null whenever any underlying enrollment has no end date, otherwise it is the maximum end date. Example: '2026-06-12'. |
| has_primary | Boolean | Whether at least one of the student's underlying class enrollments for this course is marked primary (true) or none is (false). Null only when no underlying enrollment records a primary flag. Indicates the student's main placement in the course. Example: true. |
| class_count | Integer | Number of distinct classes (course sections) the student is enrolled in for this course, counted across the rolled-up enrollments. Never null and always at least 1. Example: 2. |
Join Keys
- student_id: Join with Students dataset to get student details
- course_id: Join with Courses dataset to get course details
- school_ids: Array of school ids the student takes this course at (join with Schools via id)
- subject_ids: Array of CASE subject ids for the course (join with Case Subjects via id)
Courses
Purpose
Provides information about curriculum courses and their relationship to subjects. This dataset enables analysis of course-level organization, subject alignment, and curriculum structure within the educational hierarchy.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| id | String | Unique identifier for the course |
| subject_id | String | Unique identifier for the subject containing this course |
| title | String | Course title (defaults to 'N/A' if neither name nor description is available) |
Join Keys
- id: Primary key for joining with course-related datasets (units, lessons, tests, etc.)
- subject_id: Join with Subjects dataset to get subject details
Curriculum Items
Purpose
Provides curriculum framework item data including courses, sections, topics, levels, and standards. Each record represents a curriculum item with its classification and descriptive information, enabling analysis of curriculum structure and linking mastery data to specific learning outcomes.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| curriculum_item_id | String | Unique identifier for the curriculum item |
| curriculum_item_title | String | Full statement/description of the curriculum item (e.g., course name, section name) |
| curriculum_item_code | String | Human-readable code for the curriculum item (e.g., standard code like "CCSS.MATH.1.OA.1"). This is the item's short label/code — there is no separate "label" or "code" column. |
| curriculum_item_type | String | Type/category of the curriculum item (e.g., course, section, topic, level, standard). This is the item's classification — there is no separate "classification" or "category" column. |
Join Keys
- curriculum_item_id: Join with Students Mastery dataset to link student mastery to curriculum items
Grades
Purpose
Reference (dimension) dataset of grade levels, aligned with CEDS (Common Education Data Standards) education levels: one row per grade level with its code, human-readable label, and sort order. Use it to label and order grades and to resolve a grade id to its name. This is the canonical list of grade levels, not a student's assigned grade: to find which grade a student is in, use Placement Results (the student's placed grade per subject); this dataset has no student, subject, or date columns.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| id | String | Identifier of the grade level, a UUID from placement_grade.id. Never null; it is the primary key of this reference dataset, one row per grade level. Other datasets reference it as their grade id (e.g. Placement Results). Example: '6d5c4b3a-2e1f-4a0b-9c8d-7e6f5a4b3c2d'. |
| grade_identifier | String | CEDS education-level code for the grade, from placement_grade.grade_primary_identifier. Drawn from the CEDS vocabulary such as 'PK' (pre-kindergarten), 'KG' (kindergarten), '01' through '12', and 'PS' (postsecondary). Never null. Example: 'KG'. |
| label | String | Human-readable label for the grade level, from placement_grade.label, suitable for display. Never null. Example: 'Kindergarten' (or 'Grade 1', 'Grade 12'). |
| order_number | Integer | Integer ordinal that orders grade levels from earliest to latest, from placement_grade.order_number; unique across grades, so sorting by it yields correct grade precedence (e.g. Kindergarten before Grade 1). Never null. Example: 1. |
Join Keys
- id: Primary key for joining with Placement Results and other grade-referencing datasets
Guides
Purpose
Provides core guide (educator) identification and contact information. Contains only users who hold a 'teacher' or 'principal' role — the same educator relationship types surfaced as guides in the Student Guides dataset. This is the foundational dataset for resolving an educator's details (e.g. the guide referenced by Student Guides), the educator-side counterpart to the Students dataset.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| id | String | Unique identifier of the guide (educator), a UUID from one_roster_user.id. Primary key, never null. Join target for guide_id on the student_guides dataset. Example: '7c9e6679-7425-40de-944b-e07fc1f90ae7'. |
| name | String | Full display name of the guide, built as given_name then family_name from one_roster_user. Never null, though it may carry only one part when the other name field is empty. Example: 'Maria Gonzalez'. |
| String | Email address of the guide, from one_roster_user.email. Null when the user record has no email on file. Example: 'maria.gonzalez@school.example.edu'. | |
| org_ids | String | Array of UUIDs of the organizations this row is visible under: the guide's organizations (from one_roster_role) intersected with the caller's allowed scope. Drives org-scoped row filtering: the view is fail-closed, so when the app.allowed_org_ids session setting is unset the view returns no guides, and when it is set only guides whose organizations intersect it are returned. The emitted array is that intersection, so it never exceeds the caller's scope and may be a subset of the guide's full membership (and may be empty for an internal/unrestricted caller). The array itself is never null: it is the empty array {} when nothing is in scope. Each element joins to an organization id. Example: ['1a2b3c4d-1111-2222-3333-444455556666']. |
Join Keys
- id: Primary key for resolving a guide's details (e.g. join from Student Guides via guide_id)
- org_ids: Array of organization IDs the user belongs to; used for org-scoped filtering
Learning App Subjects
Purpose
Provides the relationship between learning applications and their associated subjects. This dataset enables subject-level analysis of learning app usage, time tracking by subject, and filtering dashboards by subject within learning app contexts.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| learning_app_id | String | Unique identifier for the learning application (foreign key to learning_apps.id) |
| subject_title | String | Subject name associated with the learning application |
Join Keys
- learning_app_id: Foreign key for joining with learning_apps.id
- subject_title: Can be matched with subjects.title for curriculum subject lookups
Learning Apps
Purpose
Provides information about learning applications integrated with the TimeBack platform. This dataset enables analysis of application usage patterns and supports filtering and grouping by specific learning tools.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| id | String | Unique identifier of the application, as a UUID. Primary key, copied from lti_application.id; never null. This is the join target for any learning_app_id across the analytics datasets (e.g. sessions.learning_app_id, student_journals.learning_app_id). Example: '7c9e6679-7425-40de-944b-e07fc1f90ae7'. |
| name | String | Display name of the application, from lti_application.name. Never null and unique across applications. Note this dataset is not restricted to learning apps: lti_application also holds assessment and internal application types, so a row here may represent any LTI application, not only a student-facing learning app. Example: 'Alpha Reading'. |
Join Keys
- id: Primary key for joining with any dataset that references learning applications (events, sessions, usage data, etc.)
Lessons
Purpose
Provides information about curriculum lessons available in the platform. This dataset enables analysis of lesson-level engagement, content organization, and curriculum coverage.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| id | String | Unique identifier for the lesson |
| title | String | Lesson title (defaults to 'N/A' if neither name nor description is available) |
Join Keys
- id: Primary key for joining with lesson-related datasets (attempts, questions, sessions, etc.)
Placement Results
Purpose
Provides placement test results showing each student's placement status and assigned grade level per subject, one row per student+subject. Each record enables analysis of placement progress, grade distribution, and assessment completion rates. A grade is assigned only once the placement reaches Completed, so grade_id is null while a placement is still NotStarted or InProgress.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| student_id | String | Identifier of the student the placement is for, a UUID from placement_student_subject_placement.student_id. Never null; together with subject_id it forms the grain, one row per student+subject. Join with the Students dataset on student_id. Example: 'a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d'. |
| subject_id | String | Identifier of the CASE subject the student was placed in, a UUID. Never null. Join with the Case Subjects dataset on id. Example: '9c8b7a6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d'. |
| grade_id | String | Identifier of the grade level the student is currently placed at for the subject, a UUID. Null when the placement has not yet determined a grade, for example while status is NotStarted or InProgress. Join with the Grades dataset on id. Example: '3d2c1b0a-9f8e-4d7c-b6a5-948372615f0e'. |
| placement_status | String | Status of the placement process for this student and subject. Allowable values are 'NotStarted', 'InProgress', and 'Completed'; a grade_id is normally present only once 'Completed'. Never null (defaults to 'NotStarted'). Example: 'Completed'. |
| last_updated | DateTime | Timestamp of the most recent change to this placement record, from date_last_modified. Use it to find the latest placement state or detect recent activity. Null only when the source never set a modification time. Example: '2026-02-09T14:30:00Z'. |
| org_ids | String | Array of UUIDs of the organizations this row is visible under: the student's organizations (from one_roster_role) intersected with the caller's allowed scope. Drives org-scoped row filtering: the view is fail-closed, so when the app.allowed_org_ids session setting is unset the view returns no rows, and when it is set only rows whose organizations intersect it are returned. The emitted array is that intersection, so it never exceeds the caller's scope and may be a subset of the student's full membership (and may be empty for an internal/unrestricted caller). The array itself is never null: it is the empty array {} when nothing is in scope. Used for filtering rather than as a strict join key. Example: ['2b1a0c9d-8e7f-4a6b-b5c4-d3e2f1a09b8c']. |
Join Keys
- student_id: Join with Students dataset to get student demographic and profile information
- subject_id: Join with Case Subjects dataset to get subject details
- grade_id: Join with Grades dataset to get grade level details (nullable)
- org_ids: Array of organization IDs the user belongs to; used for org-scoped filtering
Proctoring Insights
Purpose
Provides detailed proctoring insight events for learning sessions, capturing individual confirmed proctoring violations with their type, timing, duration, and the per-instance description shown in the Vault. Only includes external-facing proctoring insight types from proctored sessions where is_visible is true. Insight types that require review (per insights_config) are only included if they have a TruePositive review result. Each record represents a single proctoring event (e.g., Help From Another Person, Unauthorized App Use, Unauthorized Device Use) identified during a session.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| session_id | String | Identifier of the session this proctoring event occurred in, from insights_session.caliper_session_id. Rows exist only for proctored sessions (is_proctored = TRUE). Never null. Joins to sessions.id. Example: 'urn:uuid:3f2504e0-4f89-41d3-9a0c-0305e82c3301'. |
| insight_type | String | Slug identifying the kind of proctoring event, from insights_type.slug (insight types in the Proctoring category with visibility = 'external'). Never null. Allowable values are HelpFromAnotherPerson, ProctoringHelpFromAnotherPerson, ProctoringUnauthorizedAppUse, ProctoringUnauthorizedDeviceUse, UnauthorizedAppUse, UnauthorizedDeviceUse. New proctoring types may be added without code changes. Example: 'UnauthorizedAppUse'. |
| started_at_time | DateTime | Timestamp the proctoring event started, in UTC ISO-8601 format, from insights_insight.started_at_time. Never null. Always ≤ ended_at_time. Named started_at_time on the insight datasets, not start_time as on the sessions dataset. Example: '2026-06-17T09:55:00.000Z'. |
| ended_at_time | DateTime | Timestamp the proctoring event ended, in UTC ISO-8601 format, from insights_insight.ended_at_time. Never null. Always ≥ started_at_time. Named ended_at_time on the insight datasets, not end_time as on the sessions dataset. Example: '2026-06-17T09:55:15.000Z'. |
| duration_sec | Decimal | Duration of the proctoring event in whole seconds, computed as round(extract(epoch from (ended_at_time - started_at_time))). Never null. Example: 15. |
| description | String | Per-instance contextual description of the proctoring event, sourced from insights_insight.reason — the same human-readable text shown in the Vault for this insight. Never null. Example: 'Background app usage detected'. |
| org_ids | String | Array of UUIDs of the organizations this row is visible under: the session's student's organizations (from public.one_roster_role) intersected with the caller's allowed scope. Drives org-scoped row filtering: the view is fail-closed, so when the app.allowed_org_ids session setting is unset the view returns no rows, and when it is set only rows whose organizations intersect it are returned. The emitted array is that intersection, so it never exceeds the caller's scope and may be a subset of the student's full membership (and may be empty for an internal/unrestricted caller). The array itself is never null: it is the empty array {} when nothing is in scope. Each element joins to an organization id. Example: ['1a2b3c4d-1111-2222-3333-444455556666']. |
Join Keys
- session_id: Join with Sessions dataset to get session details, timing, and student information
- org_ids: Array of organization IDs the user belongs to; used for org-scoped filtering
Question Tests
Purpose
Bridge dataset linking assessment questions to the tests they belong to, one row per (question, test) pair, sourced from the Caliper 'isPartOf' relationship. The same question can be reused across more than one test, so this is a true many-to-many relationship and a question may appear in several rows; query this dataset instead of expecting a single test on the Questions dataset. Only relationships whose endpoints are real question and test entities are included, so every test_id resolves to a row in the Tests dataset (dangling identifiers are excluded).
Fields
| Field Name | Data Type | Description |
|---|---|---|
| question_id | String | Identifier of the question, a UUID (or a persistent URL) from caliper_assessment_item.id. Never null; with test_id it forms the grain of this dataset, one row per question+test pair. Join with the Questions dataset on question_id. Example: '30083978-fd4d-4c24-a276-9a9779d355a6'. |
| test_id | String | Identifier of a test the question is part of, from caliper_assessment.id, resolved through the question's 'isPartOf' relationship. Never null and always resolvable to the Tests dataset. A question reused across multiple tests yields one row per test. Join with the Tests dataset on test_id. Example: 'https://app.athena.learnwith.ai/lesson/009062fa-7bdb-4edd-a4e0-32d01cb770ea/mastery-practice'. |
Join Keys
- question_id: Join with the Questions dataset to get question details
- test_id: Join with the Tests dataset to get test details
Questions
Purpose
One row per assessment question (Caliper assessment item), with the question's title and type. Use it to identify a question. A question can belong to more than one test, so its test is not a column here; join the Question Tests dataset on id to resolve a question's test(s), and from there the Test Parents dataset to place it in the curriculum hierarchy. This dataset is identity only: it carries no per-student answer, score, time-spent, redirect, or worked-example data (those live in the question-response and results datasets), and no difficulty, subject, or standard-alignment fields (subject and standard come from the CASE framework via the curriculum item).
Fields
| Field Name | Data Type | Description |
|---|---|---|
| id | String | Identifier of the assessment question, a UUID v4 (or a persistent URL) from caliper_assessment_item.id. Never null; it is the grain of this dataset, one row per question. Join with question-level datasets (responses, results) on this id. Example: 'a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d'. |
| title | String | Human-readable title of the question, taken from the Caliper entity's name, falling back to its description, then to the literal 'N/A' when neither is recorded. Never null: the value is 'N/A' exactly when both name and description are missing. Example: 'Solve for x: 2x + 3 = 11' (or 'N/A'). |
| type | String | The question's content type, copied from caliper_assessment_item.media_type. It is a free-form string rather than a fixed enumeration; in this dataset it labels the question's delivery format, with observed values such as 'quiz' and 'guiding' rather than strict IANA media types. Null when the source item records no media type. Example: 'quiz'. |
Join Keys
- id: Primary key for joining with question-level datasets (responses, results, per-question performance, Question Tests)
Recommendations
Purpose
Provides consumer-visible coaching recommendation data for students, including generation metadata, delivery status, and student feedback. Enables analysis of recommendation volume, delivery rates, feedback sentiment distribution, and source effectiveness across organizations. Only recommendations deliverable to the student are included; internal (staff-only) recommendations are excluded at the view boundary and never reach a consumer.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| id | String | Unique identifier of the recommendation, as a UUID, from insights_recommendation.id. Primary key, never null. Example: 'd4c3b2a1-6f5e-8b7a-0d9c-2f1e4b3a6c5d'. |
| student_id | String | UUID of the student the recommendation is for, from insights_recommendation.user_id. Never null. Joins to students.id. Example: 'b3f1c2a4-7d8e-4f10-9a2b-6c5d4e3f2a1b'. |
| type | String | The kind of recommendation, from insights_recommendation.type. Free-form string, not a closed enum; new types may appear without code changes. Never null. Observed value: 'daily-coaching'. Example: 'daily-coaching'. |
| source | String | The system or process that produced the recommendation, from insights_recommendation.source. Free-form string, not a closed enum. Never null. Observed values: 'vault-agent', 'manual', 'app-generated'. Example: 'vault-agent'. |
| source_reference_id | String | Identifier of the originating record in the source system, e.g. the agent execution id, from insights_recommendation.source_reference_id. Free-form string. Null when the source records no reference. Example: 'exec_01H8XK4P2Q'. |
| title | String | Optional short title for the recommendation, from insights_recommendation.title, set by the source system. Null when the source provides no title. Example: 'Try a shorter session tomorrow'. |
| visibility | String | Who may see the recommendation, from insights_recommendation.visibility. Enum, never null. The source column allows 'internal' (staff-only) and 'student' (deliverable to the student), but this view filters to 'student' at the boundary, so every row here is 'student' — internal recommendations are excluded and never reach a consumer. Example: 'student'. |
| content | String | The recommendation message text in plain markdown, from insights_recommendation.content. Never null. Example: 'Great focus today! Tomorrow, try starting with math while your energy is high.' |
| date | Date | Calendar date on which the recommendation was generated, in YYYY-MM-DD form, derived as date(generated_at). Used for daily aggregation. Never null. Example: '2026-06-17'. |
| generated_at | DateTime | Timestamp the source produced the recommendation, in UTC ISO-8601 format, from insights_recommendation.generated_at. Never null. Example: '2026-06-17T06:00:00.000Z'. |
| delivered_at | DateTime | Timestamp the student first saw the recommendation, in UTC ISO-8601 format, from insights_recommendation.delivered_at. Null until the recommendation has been delivered to and seen by the student. Example: '2026-06-17T07:12:30.000Z'. |
| feedback_sentiment | String | The student's feedback sentiment on the recommendation, from insights_recommendation.feedback_sentiment. Enum. Allowable values: 'POSITIVE' and 'NEGATIVE'. Null when the student has not given feedback. Example: 'POSITIVE'. |
| feedback_text | String | Optional free-text feedback the student left on the recommendation, from insights_recommendation.feedback_text. Null when no feedback text was provided. Example: 'This helped me plan my morning.' |
| feedback_at | DateTime | Timestamp the student submitted feedback, in UTC ISO-8601 format, from insights_recommendation.feedback_at. Null when no feedback has been submitted. Example: '2026-06-17T08:00:00.000Z'. |
| org_ids | String | Array of UUIDs of the organizations this row is visible under: the student's organizations (from public.one_roster_role) intersected with the caller's allowed scope. Drives org-scoped row filtering: the view is fail-closed, so when the app.allowed_org_ids session setting is unset the view returns no rows, and when it is set only rows whose organizations intersect it are returned. The emitted array is that intersection, so it never exceeds the caller's scope and may be a subset of the student's full membership (and may be empty for an internal/unrestricted caller). The array itself is never null: it is the empty array {} when nothing is in scope. Each element joins to an organization id. Example: ['1a2b3c4d-1111-2222-3333-444455556666']. |
Join Keys
- id: Primary key for the recommendation
- student_id: Join with Students dataset to get student details
- org_ids: Array of organization IDs the student belongs to; used for org-scoped filtering
Resource Relations
Purpose
Provides relationship data between resources in the curriculum hierarchy. Each record represents a directional relationship from a source resource to a destination resource, enabling analysis of curriculum structure, content organization, and hierarchical navigation between entities like courses, units, lessons, tests, and questions.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| source_resource_id | String | Unique identifier for the source resource in the relationship |
| destination_resource_id | String | Unique identifier for the destination resource in the relationship |
| relationship_type | String | Type of relationship between resources (e.g., 'isPartOf' indicates the source is contained within the destination) |
| item_order | Integer | Ordering/sequence of the source resource within its relationship to the destination (nullable) |
Join Keys
- source_resource_id: Join with any resource dataset (Courses, Units, Lessons, Tests, Questions, etc.) using their id field
- destination_resource_id: Join with any resource dataset to get the related/parent resource details
School Usage Stats
Purpose
Per-school usage rollup, one row per school, giving the student count, total learning-app time, and total waste time so consumers can compare schools (e.g. a district parent org comparing its child schools) without aggregating the raw session and insight tables. A student attached to more than one school contributes to each of those schools, so totals across schools can exceed platform totals. Waste time uses the same visibility and review rules as the Waste Insights dataset.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| school_id | String | UUID of the school this usage rollup is for, from one_roster_organization.id. Never null; one row per school. Joins to schools.id (use schools.parent_id for district rollups). Example: '1a2b3c4d-1111-2222-3333-444455556666'. |
| school_name | String | Human-readable name of the school, from one_roster_organization.name. Never null. Example: 'Lincoln Elementary School'. |
| student_count | Integer | Number of distinct students attached to the school, counted across both organization role and class enrollment. Never null; 0 when no students are attached. A student attached to more than one school is counted in each school's row. Example: 327. |
| total_app_time_sec | Decimal | Total learning-app session time in whole seconds, summed across the school's students, computed from caliper_session as sum(round(extract(epoch from (ended_at_time - started_at_time)))) over sessions with both timestamps set. Never null; 0 when there are no completed sessions. Example: 1284560. |
| total_waste_time_sec | Decimal | Total waste time in whole seconds, summed across the school's students, using the same visibility and review rules as the Waste Insights dataset (external, visible, and review-confirmed insights only). Never null; 0 when no waste insights qualify. Example: 84230. |
Join Keys
- school_id: Join with Schools dataset to get school details (and parent_id for district rollups)
Schools
Purpose
Lists the schools (educational institutions) on the platform so consumers can look up a school by its human-readable name without joining the operational roster tables. Each row is one school, with the parent organization (e.g. the district it belongs to) resolved to a readable name and a count of the students attached to it.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| id | String | Unique identifier of the school, a UUID equal to the underlying one_roster_organization.id. Primary key, never null. Join target for school-scoped datasets such as student_schools.school_id and school_usage_stats.school_id. Example: '1a2b3c4d-1111-2222-3333-444455556666'. |
| name | String | Human-readable name of the school, from one_roster_organization.name. Never null. Example: 'Lincoln Elementary School'. |
| identifier | String | External (SIS-issued) identifier for the school, from one_roster_organization.identifier. Null when the school has no external identifier recorded. Example: 'SCH-00042'. |
| parent_id | String | UUID of the parent organization the school belongs to (typically its district), from one_roster_organization.parent_id. Null when the school has no parent. Joins to the organization hierarchy; a parent that is itself a school joins to schools.id. Example: '9f8e7d6c-1111-2222-3333-444455556666'. |
| parent_name | String | Human-readable name of the parent organization, from the parent one_roster_organization.name. Null when the school has no parent (parent_id is null). Example: 'Springfield Unified District'. |
| status | String | Lifecycle status of the school, from one_roster_organization.status. Allowable values are 'active', 'inactive', and 'tobedeleted'. Never null. Example: 'active'. |
| student_count | Integer | Number of distinct students attached to the school, counted across both organization role and class enrollment. Never null; 0 when no students are attached. A student attached to more than one school is counted in each. Example: 327. |
Join Keys
- id: Primary key for joining school-scoped datasets (e.g. Student Schools via school_id)
- parent_id: Parent organization the school belongs to, if any (e.g. its district)
Sessions
Purpose
Provides detailed information about learning sessions, including timing, duration, and proctoring data. This dataset enables analysis of student engagement patterns, time-on-task, and session-based learning activities across different applications.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| id | String | Unique identifier of the learning session, as recorded by Caliper. Sourced from caliper_session.id; the value is a Caliper session identifier, typically an IRI such as 'urn:uuid:...' or a bare UUID. Primary key, never null. Joins to session_id on the waste_insights, proctoring_insights, cheating_insights, and student_journals datasets. Example: 'urn:uuid:3f2504e0-4f89-41d3-9a0c-0305e82c3301'. |
| student_id | String | UUID of the student who owned this session, from caliper_session.user_id (the Person who initiated the session). Joins to students.id. Null when the underlying Caliper session has no associated person. Example: 'b3f1c2a4-7d8e-4f10-9a2b-6c5d4e3f2a1b'. |
| learning_app_id | String | Identifier of the application that hosted this session, from caliper_session.client_id (the hosting SoftwareApplication). Joins to learning_apps.id. Note this value derives from the Caliper client identifier, a different key space from student_journals.learning_app_id (which comes from insights_session.application_id). Null when the session records no hosting application. Example: '7c9e6679-7425-40de-944b-e07fc1f90ae7'. |
| date | Date | Calendar date on which the session started, in YYYY-MM-DD form, derived as date(start_time). Used for daily grouping. Null only when start_time is null. Example: '2026-06-17'. |
| start_time | DateTime | Timestamp the session started, in UTC ISO-8601 format. For native sessions (Caliper SessionEvent with action 'Started'), this is that event's eventTime. For auto-attached sessions (created when activity events tagged with urn:tag
|
| end_time | DateTime | Timestamp the session ended, in UTC ISO-8601 format. For native sessions this is the eventTime of the Caliper SessionEvent that ended or logged out the session; for auto-attached sessions (see #2044) it is extended to the eventTime of the latest activity event in the cluster, within a 1-hour inactivity window. Null while the session is still running or was never properly closed — in that case duration_sec is also null. When set, always ≥ start_time. Example: '2026-06-17T10:15:02.122Z'. |
| duration_sec | Decimal | Wall-clock length of the session in whole seconds, computed as round(extract(epoch from (end_time - start_time))). Null when end_time is null (the session is still running or was never properly closed). Named duration_sec on this dataset — note the waste_insights dataset names its equivalent waste_duration_sec. Example: 1964. |
| webcam_enabled | Boolean | Whether the webcam was enabled for this session. Sourced from insights_session.webcam_enabled and coalesced to FALSE when the session has no insights_session row, so it is never null. Only meaningfully true for proctored sessions that produced an insights record. Example: true. |
| is_proctored | Boolean | Whether this session was run under proctoring. Sourced from insights_session.is_proctored and coalesced to FALSE when the session has no insights_session row, so it is never null. Example: false. |
| org_ids | String | Array of UUIDs of the organizations this row is visible under: the session's student's organizations (from public.one_roster_role) intersected with the caller's allowed scope. Drives org-scoped row filtering: the view is fail-closed, so when the app.allowed_org_ids session setting is unset the view returns no rows, and when it is set only rows whose organizations intersect it are returned. The emitted array is that intersection, so it never exceeds the caller's scope and may be a subset of the student's full membership (and may be empty for an internal/unrestricted caller). The array itself is never null: it is the empty array {} when nothing is in scope. Each element joins to an organization id. Example: ['1a2b3c4d-1111-2222-3333-444455556666']. |
Join Keys
- id: Primary key for joining with event-level or session-related datasets
- student_id: Join with Students dataset to get student details
- learning_app_id: Join with Learning Apps dataset to get application details
- org_ids: Array of organization IDs the user belongs to; used for org-scoped filtering
Sessions Cheating
Purpose
Provides aggregated cheating violation time data for learning sessions, capturing total confirmed cheating event duration per session. Only includes external-facing cheating insight types where is_visible is true. Insight types that require review (per insights_config) are only included if they have a TruePositive review result. Overlapping cheating events are merged to avoid double-counting. This dataset enables analysis of cheating violation severity across sessions.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| session_id | String | Caliper session id (caliper_session_id of the insights_session) this cheating total is aggregated for; one row per session. Joins to the Sessions dataset on its id to get session timing and the student. Never null. Example: '7f3c1a2b-9d8e-4c6f-b1a0-2e3d4c5b6a70'. |
| cheating_duration_sec | Decimal | Total confirmed cheating-violation time for the session in whole seconds, the rounded sum of all qualifying cheating insight durations with overlapping events merged so simultaneous violations are not double-counted. Counts only external, visible cheating insights (and review-gated ones only when confirmed TruePositive). Zero is not emitted — a session with no cheating time produces no row — so the value is always > 0 and never null. Example: 184. |
| org_ids | String | Array of UUIDs of the organizations this row is visible under: the session's student's organizations (from one_roster_role) intersected with the caller's allowed scope. Drives org-scoped row filtering: the view is fail-closed, so when the app.allowed_org_ids session setting is unset the view returns no rows, and when it is set only rows whose organizations intersect it are returned. The emitted array is that intersection, so it never exceeds the caller's scope and may be a subset of the student's full membership (and may be empty for an internal/unrestricted caller). The array itself is never null: it is the empty array {} when nothing is in scope. Used for filtering rather than as a strict join key. Example: ['1a2b3c4d-1111-2222-3333-444455556666']. |
Join Keys
- session_id: Join with Sessions dataset using the id field to get session details, timing, and student information
- org_ids: Array of organization IDs the user belongs to; used for org-scoped filtering
Sessions Proctoring
Purpose
Provides aggregated proctoring violation time data for learning sessions, capturing total confirmed proctoring event duration per session. Only includes external-facing proctoring insight types from proctored sessions where is_visible is true. Insight types that require review (per insights_config) are only included if they have a TruePositive review result. Overlapping proctoring events are merged to avoid double-counting. This dataset enables analysis of proctoring violation severity across sessions.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| session_id | String | Caliper session id (caliper_session_id of the insights_session) this proctoring total is aggregated for; one row per proctored session. Joins to the Sessions dataset on its id to get session timing and the student. Never null. Example: '7f3c1a2b-9d8e-4c6f-b1a0-2e3d4c5b6a70'. |
| proctoring_duration_sec | Decimal | Total confirmed proctoring-violation time for the session in whole seconds, the rounded sum of all qualifying proctoring insight durations with overlapping events merged so simultaneous violations are not double-counted. Counts only external, visible proctoring insights on proctored sessions (and review-gated ones only when confirmed TruePositive). Zero is not emitted — a session with no proctoring time produces no row — so the value is always > 0 and never null. Example: 95. |
| org_ids | String | Array of UUIDs of the organizations this row is visible under: the session's student's organizations (from one_roster_role) intersected with the caller's allowed scope. Drives org-scoped row filtering: the view is fail-closed, so when the app.allowed_org_ids session setting is unset the view returns no rows, and when it is set only rows whose organizations intersect it are returned. The emitted array is that intersection, so it never exceeds the caller's scope and may be a subset of the student's full membership (and may be empty for an internal/unrestricted caller). The array itself is never null: it is the empty array {} when nothing is in scope. Used for filtering rather than as a strict join key. Example: ['1a2b3c4d-1111-2222-3333-444455556666']. |
Join Keys
- session_id: Join with Sessions dataset using the id field to get session details, timing, and student information
- org_ids: Array of organization IDs the user belongs to; used for org-scoped filtering
Sessions Waste
Purpose
Provides aggregated waste time data for learning sessions, capturing non-productive or off-task time identified by the insights system. Includes external insight types flagged as waste (engagement, proctoring, and cheating categories). Only includes insights where is_visible is true. Insight types that require review (per insights_config) are only included if they have a TruePositive review result. This dataset enables analysis of student focus, distraction patterns, and effective learning time across sessions.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| session_id | String | Caliper session id (caliper_session_id of the insights_session) this waste total is aggregated for; one row per session. Joins to the Sessions dataset on its id to get session timing and the student. Never null. Example: '7f3c1a2b-9d8e-4c6f-b1a0-2e3d4c5b6a70'. |
| waste_duration_sec | Decimal | Total non-productive (off-task) time for the session in whole seconds, the rounded sum of all qualifying waste insight durations. Counts only external, visible insight types flagged as waste (spanning engagement, proctoring, and cheating categories, and review-gated ones only when confirmed TruePositive). Zero is not emitted — a session with no waste time produces no row — so the value is always > 0 and never null. Example: 240. |
| org_ids | String | Array of UUIDs of the organizations this row is visible under: the session's student's organizations (from one_roster_role) intersected with the caller's allowed scope. Drives org-scoped row filtering: the view is fail-closed, so when the app.allowed_org_ids session setting is unset the view returns no rows, and when it is set only rows whose organizations intersect it are returned. The emitted array is that intersection, so it never exceeds the caller's scope and may be a subset of the student's full membership (and may be empty for an internal/unrestricted caller). The array itself is never null: it is the empty array {} when nothing is in scope. Used for filtering rather than as a strict join key. Example: ['1a2b3c4d-1111-2222-3333-444455556666']. |
Join Keys
- session_id: Join with Sessions dataset using the id field to get session details, timing, and student information
- org_ids: Array of organization IDs the user belongs to; used for org-scoped filtering
Student Guides
Purpose
Links students to their guides (educators) so consumers can answer "who is student X's guide" directly without reconstructing it from the raw agent table. A guide relationship is stored in one_roster_user_agent with the student as the source and the educator as the agent; this view keeps only the educator relationship types ('teacher' and 'principal') and excludes family relationships (parent, guardian) and peer/administrative links. A student with more than one guide (or the same guide over more than one period) appears once per row.
Full history is preserved: a guide relationship that ends is end-dated (end_date set, status inactive) rather than deleted. A distinct new relationship is a new row; re-establishing the same student/guide/type reopens that relationship's period (a partial unique index keeps at most one open period per relationship). Use begin_date/end_date for point-in-time questions such as "who was student X's guide on date D" (begin_date null = open start, end_date null = ongoing). assigned_date (row creation) remains as the timestamp the row was first recorded. org_ids reflects the student's current organizations (ended role memberships are excluded from org scoping).
Fields
| Field Name | Data Type | Description |
|---|---|---|
| student_id | String | UUID of the student the guide is assigned to, from one_roster_user_agent.source_user_id. Never null. Joins to students.id. Example: '7c9e6679-7425-40de-944b-e07fc1f90ae7'. |
| student_name | String | Full display name of the student, built as given_name then family_name from one_roster_user. Never null, though it may carry only one part when the other name field is empty. Example: 'Jordan Lee'. |
| guide_id | String | UUID of the guide (educator) assigned to the student, from one_roster_user_agent.agent_user_id. Never null. Joins to guides.id. Example: 'b3f1c2a4-7d8e-4f10-9a2b-6c5d4e3f2a1b'. |
| guide_name | String | Full display name of the guide, built as given_name then family_name from one_roster_user. Never null, though it may carry only one part when the other name field is empty. Example: 'Maria Gonzalez'. |
| relationship_type | String | Type of guide relationship, from one_roster_user_agent.relationship_type. Allowable values in this dataset are 'teacher' and 'principal'; family relationships (parent, guardian) and other link types are excluded. Never null. Example: 'teacher'. |
| status | String | Lifecycle status of the guide relationship, from one_roster_user_agent.status. Allowable values are 'active', 'inactive', and 'tobedeleted'. A relationship that has ended is 'inactive' with end_date set. Never null. Example: 'active'. |
| begin_date | Date | Calendar date the guide relationship became effective, in YYYY-MM-DD form, from one_roster_user_agent.begin_date. Null when no start date was recorded (open start). Use with end_date for point-in-time membership. Example: '2026-08-15'. |
| end_date | Date | Calendar date the guide relationship ended, in YYYY-MM-DD form, from one_roster_user_agent.end_date. Null means the relationship is ongoing (no end recorded). Example: '2027-06-12'. |
| assigned_date | DateTime | Timestamp the relationship row was created, in UTC ISO-8601 format, from one_roster_user_agent.date_created. The timestamp the row was first recorded; use begin_date for the effective start of the relationship. Never null. Example: '2026-08-15T13:20:05.000Z'. |
| last_modified_date | DateTime | Timestamp the relationship row was last modified, in UTC ISO-8601 format, from one_roster_user_agent.date_last_modified. Never null; equals assigned_date when the row has never been updated. Example: '2026-09-01T08:05:42.000Z'. |
| org_ids | String | Array of UUIDs of the organizations this row is visible under: the student's organizations (from one_roster_role) intersected with the caller's allowed scope. Drives org-scoped row filtering: the view is fail-closed, so when the app.allowed_org_ids session setting is unset the view returns no rows, and when it is set only rows whose organizations intersect it are returned. The emitted array is that intersection, so it never exceeds the caller's scope and may be a subset of the student's full membership (and may be empty for an internal/unrestricted caller). The array itself is never null: it is the empty array {} when nothing is in scope. Each element joins to an organization id. Example: ['1a2b3c4d-1111-2222-3333-444455556666']. |
Join Keys
- student_id: Join with Students dataset to get student details
- guide_id: Join with Guides dataset (via id) to resolve the guide's details
- org_ids: Array of organization IDs the student belongs to; used for org-scoped filtering
Student Journals
Purpose
Provides journal entries captured during learning sessions for externally visible journal types. This dataset enables analysis of student reflections, self-reported observations, and qualitative feedback recorded through the platform.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| id | String | Unique identifier of the journal entry, as a UUID, from insights_insight.id (a Journal-slug insight). Primary key, never null. Example: 'a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d'. |
| student_id | String | UUID of the student who wrote the journal entry, from insights_session.user_id. Never null. Joins to students.id. Example: 'b3f1c2a4-7d8e-4f10-9a2b-6c5d4e3f2a1b'. |
| session_id | String | Identifier of the session in which the journal was captured, from insights_session.caliper_session_id. Never null. Joins to sessions.id. Example: 'urn:uuid:3f2504e0-4f89-41d3-9a0c-0305e82c3301'. |
| learning_app_id | String | UUID of the application in which the journal was created, from insights_session.application_id. Never null. Joins to learning_apps.id. Note this derives from insights_session.application_id (an lti_application FK), a different key space from sessions.learning_app_id (which comes from caliper_session.client_id). Example: '7c9e6679-7425-40de-944b-e07fc1f90ae7'. |
| journal_text | String | The free-text body of the journal entry the student recorded, from insights_insight.reason. Plain text, never null. Example: 'Today I finally understood long division after re-watching the lesson.' |
| date | Date | Calendar date on which the journal entry was created, in YYYY-MM-DD form, derived as date(timestamp). Used for daily grouping. Never null. Example: '2026-06-17'. |
| timestamp | DateTime | Timestamp the journal entry was recorded, in UTC ISO-8601 format, from insights_insight.started_at_time. Never null. Example: '2026-06-17T09:42:18.451Z'. |
| org_ids | String | Array of UUIDs of the organizations this row is visible under: the student's organizations (from public.one_roster_role) intersected with the caller's allowed scope. Drives org-scoped row filtering: the view is fail-closed, so when the app.allowed_org_ids session setting is unset the view returns no rows, and when it is set only rows whose organizations intersect it are returned. The emitted array is that intersection, so it never exceeds the caller's scope and may be a subset of the student's full membership (and may be empty for an internal/unrestricted caller). The array itself is never null: it is the empty array {} when nothing is in scope. Each element joins to an organization id. Example: ['1a2b3c4d-1111-2222-3333-444455556666']. |
Join Keys
- id: Primary key for the journal entry
- student_id: Join with Students dataset to get student details
- session_id: Join with Sessions dataset using the id field to get session details and timing
- learning_app_id: Join with Learning Apps dataset to get application details
- org_ids: Array of organization IDs the user belongs to; used for org-scoped filtering
Student Schools
Purpose
Links students to the schools they belong to, so consumers can answer "which students are attached to school X" directly without reconstructing membership from the raw roster tables. A student attaches to a school in two ways, and both are covered here: through their organization role (primary or secondary) and through enrollment in a class held at the school. The link_kind column makes the attachment type explicit so the two can be told apart, and begin_date/end_date expose when the attachment was active so consumers can reconstruct a student's school history over time. A student attached to one school in more than one way (or over more than one period) appears once per distinct attachment.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| student_id | String | UUID of the student attached to the school, from one_roster_role.user_id or one_roster_enrollment.user_id. Never null. Joins to students.id. Example: '7c9e6679-7425-40de-944b-e07fc1f90ae7'. |
| school_id | String | UUID of the school the student is attached to, from one_roster_organization.id (organizations of type 'school'). Never null. Joins to schools.id. Example: '1a2b3c4d-1111-2222-3333-444455556666'. |
| school_name | String | Human-readable name of the school the student is attached to, from one_roster_organization.name. Never null. Example: 'Lincoln Elementary School'. |
| link_kind | String | How the student attaches to the school. Allowable values are 'primary_role' (primary organization role), 'secondary_role' (secondary organization role), and 'enrollment' (enrolled in a class held at the school). Never null. Example: 'enrollment'. |
| begin_date | Date | Calendar date the attachment became effective, in YYYY-MM-DD form, from the role's or enrollment's begin_date. Null when no start date was recorded. Use with end_date for point-in-time membership. Example: '2026-08-15'. |
| end_date | Date | Calendar date the attachment ended, in YYYY-MM-DD form, from the role's or enrollment's end_date. Null means the attachment is ongoing (no end recorded). Example: '2027-06-12'. |
| org_ids | String | Array of UUIDs of the organizations this row is visible under: the student's organizations (from one_roster_role) intersected with the caller's allowed scope. Drives org-scoped row filtering: the view is fail-closed, so when the app.allowed_org_ids session setting is unset the view returns no rows, and when it is set only rows whose organizations intersect it are returned. The emitted array is that intersection, so it never exceeds the caller's scope and may be a subset of the student's full membership (and may be empty for an internal/unrestricted caller). The array itself is never null: it is the empty array {} when nothing is in scope. Each element joins to an organization id. Example: ['1a2b3c4d-1111-2222-3333-444455556666']. |
Join Keys
- student_id: Join with Students dataset to get student details
- school_id: Join with Schools dataset to get school details
- org_ids: Array of organization IDs the student belongs to; used for org-scoped filtering
Student Start Dates
Purpose
One row per student giving the three canonical "start date" anchors in one place, so a consumer does not have to reconstruct them from roles, enrollments, and assessment results. admission_date comes from the student's primary school role (falling back to any school role); earliest_enrollment_date is the earliest class-enrollment begin date; earliest_map_date is the date of the student's first completed MAP standardized assessment. Each anchor is independent and any of them can be null when the underlying record does not exist. This dataset carries only these date anchors and the org-scoping array; it has no subject, grade, school, or score columns.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| student_id | String | Identifier of the student, a UUID restricted to users holding the 'student' role. Never null; it is the grain of this dataset, one row per student. Join with the Students dataset on student_id. Example: 'a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d'. |
| admission_date | Date | Admission date from the student's primary school role, falling back to any school role, as a calendar date. Currently backfilled from the role's begin date as a transitional proxy until authoritative admission data is ingested, so it may equal earliest_enrollment_date. Null when the student has no school role carrying an admission date. Example: '2025-08-25'. |
| earliest_enrollment_date | Date | Earliest class-enrollment begin date across the student's student-role enrollments, as a calendar date: when the student first started any class. Null when none of the student's enrollments record a begin date. Example: '2025-09-02'. |
| earliest_map_date | Date | Date of the student's first completed MAP standardized assessment (the earliest active gradebook assessment result that carries a report URL), as a calendar date. Null when the student has no completed MAP result. Example: '2025-09-15'. |
| org_ids | String | Array of UUIDs of the organizations this row is visible under: the student's organizations (from one_roster_role) intersected with the caller's allowed scope. Drives org-scoped row filtering: the view is fail-closed, so when the app.allowed_org_ids session setting is unset the view returns no rows, and when it is set only rows whose organizations intersect it are returned. The emitted array is that intersection, so it never exceeds the caller's scope and may be a subset of the student's full membership (and may be empty for an internal/unrestricted caller). The array itself is never null: it is the empty array {} when nothing is in scope. Used for filtering rather than as a strict join key. Example: ['2b1a0c9d-8e7f-4a6b-b5c4-d3e2f1a09b8c']. |
Join Keys
- student_id: Join with the Students dataset to get student details
- org_ids: Array of organization IDs the student belongs to; used for org-scoped filtering
Students
Purpose
Provides core student identification and contact information. Contains only users who hold a 'student' role (educators, guides, and family members are excluded — see the Guides dataset for educators). This is the foundational dataset for joining student-related data across all other datasets in the analytics environment.
Fields
| Field Name | Data Type | Description | | :---------- | :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --- | --- | --- | ---------------------------------------------------------------------------------------------------------------------------------------------- | | id | String | Unique identifier of the student, as a UUID. Primary key, copied from one_roster_user.id; never null. This is the value other datasets reference as student_id (sessions, recommendations, student_journals, waste/proctoring/cheating insights via their session). Example: 'b3f1c2a4-7d8e-4f10-9a2b-6c5d4e3f2a1b'. | | name | String | The student's full display name, formed by concatenating the given and family names from their SIS-issued OneRoster user record as given_name | | ' ' | | family_name (single space separator). Both source columns are required, so this is never null. Not guaranteed unique. Example: 'Ada Lovelace'. | | email | String | The student's email address, taken verbatim from the OneRoster user record. Case-insensitive (stored as citext) and unique across users; never null. Example: 'ada.lovelace@school.edu'. | | org_ids | String | Array of UUIDs of the organizations this row is visible under: the student's organizations (from public.one_roster_role) intersected with the caller's allowed scope. Drives org-scoped row filtering: the view is fail-closed, so when the app.allowed_org_ids session setting is unset the view returns no rows, and when it is set only rows whose organizations intersect it are returned. The emitted array is that intersection, so it never exceeds the caller's scope and may be a subset of the student's full membership (and may be empty for an internal/unrestricted caller). The array itself is never null: it is the empty array {} when nothing is in scope. Each element joins to an organization id (one_roster organizations). Example: ['1a2b3c4d-1111-2222-3333-444455556666','5e6f7a8b-7777-8888-9999-aaaabbbbcccc']. |
Join Keys
- id: Primary key for joining with any student-related dataset (performance, events, enrollments, etc.)
- org_ids: Array of organization IDs the user belongs to; used for org-scoped filtering
Students Enrollments
Purpose
DEPRECATED — prefer the Student Schools dataset, which links students to schools with an explicit link_kind (primary role, secondary role, or enrollment) and a joinable school_id. This view reports role-based membership across every organization type (school, district, department, and so on), one row per student-organization role, keyed only by the organization's name and not by a joinable id; it is not a class enrollment. It carries no school_id, subject, grade, or class column. For school linkage use Student Schools; for the courses or subjects a student is enrolled in use Course Enrollments. Retained temporarily for backward compatibility and will be removed once consumers migrate.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| student_id | String | Identifier of the student, a UUID from one_roster_role.user_id. Never null; with organization_name it forms the grain, one row per student-organization role. Join with the Students dataset on student_id. Example: 'a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d'. |
| organization_name | String | Display name of an organization the student holds a role in (any organization type, not specifically a school), from one_roster_organization.name. This is a name string, not a joinable id, so organizations that share a name are indistinguishable here; use the Student Schools dataset when a school id is needed. Never null. Example: 'Alpha High School'. |
| org_ids | String | Array of UUIDs of the organizations this row is visible under: the student's organizations (from one_roster_role) intersected with the caller's allowed scope. Drives org-scoped row filtering: the view is fail-closed, so when the app.allowed_org_ids session setting is unset the view returns no rows, and when it is set only rows whose organizations intersect it are returned. The emitted array is that intersection, so it never exceeds the caller's scope and may be a subset of the student's full membership (and may be empty for an internal/unrestricted caller). The array itself is never null: it is the empty array {} when nothing is in scope. Used for filtering rather than as a strict join key. Example: ['2b1a0c9d-8e7f-4a6b-b5c4-d3e2f1a09b8c']. |
Join Keys
- student_id: Join with the Students dataset to get student details
- org_ids: Array of organization IDs the student belongs to; used for org-scoped filtering
Students Mastery
Purpose
Mastery achievements earned by students, one row per mastery credential: a student's measured mastery of a single CASE curriculum item (a learning standard or objective). Restricted to standard- and curriculum-mastery credentials. Use it for "how well has this student mastered this item" and learning-gap analysis. Mastery is keyed by curriculum item, not by subject or grade: there is no subject or grade column here. To reach the subject, join curriculum_item_id to the curriculum item and on to Case Subjects; for a student's grade level use Placement Results (per subject) or the Grades reference dataset. This dataset is mastery-credential level and carries no per-attempt or per-session detail (use Attempts and Students XP for that).
Fields
| Field Name | Data Type | Description |
|---|---|---|
| student_id | String | Identifier of the student who earned the mastery credential, a UUID from clr_achievement_credential.credential_subject_id (OneRosterUser.id). Never null; with curriculum_item_id it identifies the mastery record. Join with the Students dataset on student_id. Example: 'a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d'. |
| mastery_percentage | Decimal | Mastery level as a percentage from 0 to 100, computed as the credential's result_value (a 0-to-1 progress fraction toward the mastery achievement) multiplied by 100, rounded to two decimals. Null when the credential carries no result_value. Example: 87.50. |
| curriculum_item_id | String | Identifier of the CASE curriculum item (CFItem: a learning standard or objective) this mastery is measured against, from clr_achievement.cf_item_id. This is a curriculum-item id, not a subject or grade. Null when the underlying achievement is not aligned to a CASE item. Join to the curriculum item on its identifier, then to Case Subjects for the subject. Example: '3f2e1d0c-9b8a-4c7d-8e6f-5a4b3c2d1e0f'. |
| mastery_timestamp | DateTime | Timestamp the mastery credential was originally awarded, from clr_achievement_credential.awarded_date, in UTC. Use it to place mastery on a timeline (e.g. highest item mastered as of a date). Null when the original award date was not preserved on the credential. Example: '2026-04-18T14:05:22.000Z'. |
| learning_app_id | String | Identifier of the learning application whose curriculum contains the mastered item, resolved via the item's CASE document to lti_application_curriculum_scope.lti_application_id. Null when the item's document maps to no application. Join with the Learning Apps dataset on learning_app_id. Example: '9c8b7a6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d'. |
| org_ids | String | Array of UUIDs of the organizations this row is visible under: the student's organizations (from one_roster_role) intersected with the caller's allowed scope. Drives org-scoped row filtering: the view is fail-closed, so when the app.allowed_org_ids session setting is unset the view returns no rows, and when it is set only rows whose organizations intersect it are returned. The emitted array is that intersection, so it never exceeds the caller's scope and may be a subset of the student's full membership (and may be empty for an internal/unrestricted caller). The array itself is never null: it is the empty array {} when nothing is in scope. Used for filtering rather than as a strict join key. Example: ['2b1a0c9d-8e7f-4a6b-b5c4-d3e2f1a09b8c']. |
Join Keys
- student_id: Join with the Students dataset to get student demographic and profile information
- curriculum_item_id: Join with the curriculum item (CASE CFItem); from there reach Case Subjects for the subject
- learning_app_id: Join with the Learning Apps dataset to get application details
- org_ids: Array of organization IDs the student belongs to; used for org-scoped filtering
Students Xp
Purpose
Provides a comprehensive record of experience points (XP) earned by students across different learning applications and sessions. This dataset tracks all XP transactions, enabling analysis of student engagement patterns, learning progression, and gamification effectiveness. Each row is the XP total for a student within one learning app, session, and day, linked back to its originating Caliper event.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| student_id | String | Identifier of the student who earned the XP, a UUID from tb_xp_ledger.user_id. Never null. Join with the Students dataset on student_id. Example: 'a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d'. |
| learning_app_id | String | Identifier of the learning application in which the XP was earned, a UUID from tb_xp_ledger.application_id. Never null (every ledger entry is attributed to an application). Join with the Learning Apps dataset on id. Example: '5a4b3c2d-1e0f-4a9b-8c7d-6e5f4a3b2c1d'. |
| session_id | String | Identifier of the learning session the XP was earned in, taken from the originating Caliper event. Null when the source event has no session. Join with the Sessions dataset on session_id. Example: '6e5d4c3b-2a19-4087-9f6e-5d4c3b2a1908'. |
| date | Date | Calendar date on which the XP was earned, derived from the ledger entry's creation timestamp. Null only when that timestamp is missing. Rows are aggregated per student, app, session, and date. Example: '2026-03-14'. |
| total_value | Decimal | Total experience points earned for this student, app, session, and date, summed across the underlying ledger entries. Never null; typically positive, can be zero, and may be negative where the ledger records a correction. Example: 150. |
| org_ids | String | Array of UUIDs of the organizations this row is visible under: the student's organizations (from one_roster_role) intersected with the caller's allowed scope. Drives org-scoped row filtering: the view is fail-closed, so when the app.allowed_org_ids session setting is unset the view returns no rows, and when it is set only rows whose organizations intersect it are returned. The emitted array is that intersection, so it never exceeds the caller's scope and may be a subset of the student's full membership (and may be empty for an internal/unrestricted caller). The array itself is never null: it is the empty array {} when nothing is in scope. Used for filtering rather than as a strict join key. Example: ['2b1a0c9d-8e7f-4a6b-b5c4-d3e2f1a09b8c']. |
Join Keys
- student_id: Join with Students dataset to get student demographic and profile information
- learning_app_id: Join with Learning Apps dataset to get application details and metadata
- session_id: Join with Sessions dataset to get session context, timing, and related activities
- org_ids: Array of organization IDs the user belongs to; used for org-scoped filtering
Subjects
Purpose
Provides information about curriculum subjects available in the platform. This dataset enables analysis of subject-level organization, content categorization, and high-level curriculum structure.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| id | String | Unique identifier for the subject |
| title | String | Subject title (defaults to 'N/A' if neither name nor description is available) |
Join Keys
- id: Primary key for joining with subject-related datasets (courses, units, lessons, etc.)
Test Parents
Purpose
Bridge dataset linking tests to their parent curriculum resources, one row per (test, parent) pair, sourced from the Caliper 'isPartOf' relationship. A test's parent is not a single fixed level: it can be a topic, section, course, lesson, level, unit, or other curriculum resource, and a test can have more than one parent, so this is a true many-to-many relationship. The parent_type column tells you which kind of resource each parent is, so you join the matching dataset. Only relationships whose parent is a real curriculum resource are included. Note: the same logical parent may currently appear under more than one identifier form in the source data, so a test may show duplicate-looking parents; identifier canonicalisation is tracked upstream.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| test_id | String | Identifier of the test, from caliper_assessment.id. Never null; with parent_id it forms the grain of this dataset, one row per test+parent pair. Join with the Tests dataset on test_id. Example: 'https://app.athena.learnwith.ai/lesson/009062fa-7bdb-4edd-a4e0-32d01cb770ea/mastery-practice'. |
| parent_id | String | Identifier of a parent curriculum resource the test belongs to, a UUID (or a persistent URL) from caliper_assignable_digital_resource.id, resolved through the test's 'isPartOf' relationship. Never null. Use parent_type to pick the dataset to join (e.g. Courses when parent_type is 'curriculum/course', Lessons when 'curriculum/lesson'). Example: '88405b15-2d9f-11f1-82c5-0e986e48a3f9'. |
| parent_type | String | The parent resource's content type, copied from caliper_assignable_digital_resource.media_type. A free-form string rather than a fixed enumeration; observed values include 'curriculum/topic', 'curriculum/section', 'curriculum/course', 'curriculum/level', 'curriculum/lesson', and 'curriculum/unit'. Tells you which dataset to join parent_id against. Null when the source resource records no media type. Example: 'curriculum/topic'. |
Join Keys
- test_id: Join with the Tests dataset to get test details
- parent_id: Join with the dataset matching parent_type (Courses, Units, Lessons, etc.) to get the parent's details
Tests
Purpose
Provides information about assessments, one row per test. This dataset enables analysis of test-level performance, assessment organization, and curriculum alignment. A test's place in the curriculum is not a single lesson: its parent can be a topic, section, course, lesson, level, or unit, and a test can have more than one parent, so the parent is not a column here; join the Test Parents dataset on id to resolve a test's parent(s) and their type.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| id | String | Identifier of the test (Caliper assessment), a UUID (or a persistent URL) from caliper_assessment.id. Never null; it is the grain of this dataset, one row per test. Join with test-level datasets (questions via Question Tests, attempts, results, Test Parents) on this id. Example: 'https://app.athena.learnwith.ai/lesson/009062fa-7bdb-4edd-a4e0-32d01cb770ea/mastery-practice'. |
| title | String | Human-readable title of the test, taken from the Caliper entity's name, falling back to its description, then to the literal 'N/A' when neither is recorded. Never null: the value is 'N/A' exactly when both name and description are missing. Example: 'Mastery Practice' (or 'N/A'). |
Join Keys
- id: Primary key for joining with test-related datasets (questions, attempts, results, Test Parents, etc.)
Unit Courses
Purpose
Bridge dataset linking curriculum units to the courses they belong to, one row per (unit, course) pair, sourced from the Caliper 'isPartOf' relationship. A unit can belong to more than one course, so this is a true many-to-many relationship and a unit may appear in several rows; query this dataset instead of expecting a single course on the Units dataset. Only relationships whose endpoints are real curriculum entities are included (a unit with no recorded course parent has no row here).
Fields
| Field Name | Data Type | Description |
|---|---|---|
| unit_id | String | Identifier of the unit, a UUID from caliper_assignable_digital_resource.id (media_type 'curriculum/unit'). Never null; with course_id it forms the grain of this dataset, one row per unit+course pair. Join with the Units dataset on unit_id. Example: '1f977081-014b-4bc7-99eb-cf49b526f418'. |
| course_id | String | Identifier of a course the unit belongs to, a UUID from caliper_assignable_digital_resource.id (media_type 'curriculum/course'), resolved through the unit's 'isPartOf' relationship. Never null. A unit with multiple course parents yields one row per course. Join with the Courses dataset on course_id. Example: 'dd66c2a7-d200-11ec-829e-12bc5a81f3ad'. |
Join Keys
- unit_id: Join with the Units dataset to get unit details
- course_id: Join with the Courses dataset to get course details
Units
Purpose
Provides information about curriculum units, one row per unit. This dataset enables analysis of unit-level organization and curriculum structure within the educational hierarchy. A unit can belong to more than one course, so the parent course is not a column here; join the Unit Courses dataset on id to resolve a unit's course(s).
Fields
| Field Name | Data Type | Description |
|---|---|---|
| id | String | Identifier of the unit, a UUID from caliper_assignable_digital_resource.id (media_type 'curriculum/unit'). Never null; it is the grain of this dataset, one row per unit. Join with unit-level datasets (lessons, tests, Unit Courses) on this id. Example: '1f977081-014b-4bc7-99eb-cf49b526f418'. |
| title | String | Human-readable title of the unit, taken from the Caliper entity's name, falling back to its description, then to the literal 'N/A' when neither is recorded. Never null: the value is 'N/A' exactly when both name and description are missing. Example: 'Unit 1: Foundations' (or 'N/A'). |
Join Keys
- id: Primary key for joining with unit-related datasets (lessons, tests, questions, Unit Courses, etc.)
Waste Insights
Purpose
Provides detailed waste time insights for learning sessions, capturing individual waste events with their duration, type, timing, and the per-instance description shown in the Vault. Includes external insight types flagged as waste (engagement, proctoring, and cheating categories). Only includes insights where is_visible is true. Insight types that require review (per insights_config) are only included if they have a TruePositive review result. Each record represents a single insight/distraction event identified during a session, enabling granular analysis of waste patterns, distraction types, and their impact on learning time.
Fields
| Field Name | Data Type | Description |
|---|---|---|
| waste_duration_sec | Decimal | Duration of the waste/distraction event in whole seconds, computed as round(extract(epoch from (ended_at_time - started_at_time))). Never null (the insight's start and end timestamps are required). Named waste_duration_sec on this dataset, not duration_sec as on the sessions and attempts datasets. Example: 42. |
| waste_type | String | Slug identifying the kind of waste/distraction event, from insights_type.slug — every type included here has is_waste = TRUE. Never null. Allowable values are the waste insight-type slugs, including engagement slugs such as AwayFromSeat, Idling, EyesOffScreen, Socializing, NonLearningContent, InappropriateExternalHelp, SupplementalLearning, IgnoringHelp, SkipAssessment, AbandonedAssessment, TopicShopping, plus the proctoring-category waste slugs UnauthorizedAppUse and UnauthorizedDeviceUse. New waste types may be added without code changes. Example: 'EyesOffScreen'. |
| session_id | String | Identifier of the session this waste event occurred in, from insights_session.caliper_session_id. Never null. Joins to sessions.id. Example: 'urn:uuid:3f2504e0-4f89-41d3-9a0c-0305e82c3301'. |
| started_at_time | DateTime | Timestamp the waste event started, in UTC ISO-8601 format, from insights_insight.started_at_time. Never null. Always ≤ ended_at_time. Named started_at_time on the insight datasets, not start_time as on the sessions and attempts datasets. Example: '2026-06-17T09:50:12.000Z'. |
| ended_at_time | DateTime | Timestamp the waste event ended, in UTC ISO-8601 format, from insights_insight.ended_at_time. Never null. Always ≥ started_at_time. Named ended_at_time on the insight datasets, not end_time as on the sessions and attempts datasets. Example: '2026-06-17T09:50:54.000Z'. |
| description | String | Per-instance contextual description of the waste event, sourced from insights_insight.reason — the same human-readable text shown in the Vault for this insight. Never null. Example, for a TopicShopping event: 'You started "Lesson A" but switched to "Lesson B" before finishing — that time was wasted.' |
| org_ids | String | Array of UUIDs of the organizations this row is visible under: the session's student's organizations (from public.one_roster_role) intersected with the caller's allowed scope. Drives org-scoped row filtering: the view is fail-closed, so when the app.allowed_org_ids session setting is unset the view returns no rows, and when it is set only rows whose organizations intersect it are returned. The emitted array is that intersection, so it never exceeds the caller's scope and may be a subset of the student's full membership (and may be empty for an internal/unrestricted caller). The array itself is never null: it is the empty array {} when nothing is in scope. Each element joins to an organization id. Example: ['1a2b3c4d-1111-2222-3333-444455556666']. |
Join Keys
- session_id: Join with Sessions dataset to get session details, timing, and student information
- org_ids: Array of organization IDs the user belongs to; used for org-scoped filtering
