> ## Documentation Index
> Fetch the complete documentation index at: https://docs.timeback.com/llms.txt
> Use this file to discover all available pages before exploring further.

# EduBridge

> EduBridge API client for analytics and resource management

## Overview

The EduBridge client provides access to the EduBridge API, offering:

* **Enrollments**: Simplified enrollment management
* **Analytics**: Pre-aggregated student performance data
* **Subject Tracks**: K-12 curriculum sequence management
* **Users**: User management with role-based filtering
* **Applications**: Application-level configuration
* **Learning Reports**: Aggregated learning reports

## Installation

<CodeGroup>
  ```bash npm theme={null}
  npm install @timeback/edubridge
  ```

  ```bash pnpm theme={null}
  pnpm add @timeback/edubridge
  ```

  ```bash yarn theme={null}
  yarn add @timeback/edubridge
  ```

  ```bash bun theme={null}
  bun add @timeback/edubridge
  ```

  ```bash pip theme={null}
  pip install timeback-edubridge
  ```

  ```bash uv theme={null}
  uv add timeback-edubridge
  ```
</CodeGroup>

## Quick Start

<CodeGroup>
  ```typescript TypeScript theme={null}
  import { EdubridgeClient } from '@timeback/edubridge'

  const client = new EdubridgeClient({
  	env: 'staging',
  	auth: {
  		clientId: process.env.EDUBRIDGE_CLIENT_ID!,
  		clientSecret: process.env.EDUBRIDGE_CLIENT_SECRET!,
  	},
  })

  const enrollment = await client.enrollments.enroll('user-123', 'course-123')
  const enrollments = await client.enrollments.list({ userId: 'user-123' })
  const activity = await client.analytics.getActivity({
  	studentId: 'user-123',
  	startDate: '2024-01-01',
  	endDate: '2024-01-31',
  })
  ```

  ```python Python theme={null}
  from timeback_edubridge import EdubridgeClient

  client = EdubridgeClient(
      env="staging",
      client_id=os.environ["EDUBRIDGE_CLIENT_ID"],
      client_secret=os.environ["EDUBRIDGE_CLIENT_SECRET"],
  )

  enrollment = await client.enrollments.enroll("user-123", "course-123")
  enrollments = await client.enrollments.list(user_id="user-123")
  activity = await client.analytics.get_activity(
      student_id="user-123",
      start_date="2024-01-01",
      end_date="2024-01-31",
  )
  ```
</CodeGroup>

## Enrollments

Course-centric enrollment management.

<CodeGroup>
  ```typescript TypeScript theme={null}
  client.enrollments.list({ userId })
  client.enrollments.enroll(userId, courseId, schoolId?, options?)
  client.enrollments.unenroll(userId, courseId, schoolId?)
  client.enrollments.resetGoals(courseId)
  client.enrollments.resetProgress(userId, courseId)
  client.enrollments.getDefaultClass(courseId, schoolId?)
  ```

  ```python Python theme={null}
  await client.enrollments.list(user_id=user_id)
  await client.enrollments.enroll(user_id, course_id, school_id=..., options=...)
  await client.enrollments.unenroll(user_id, course_id, school_id=...)
  await client.enrollments.reset_goals(course_id)
  await client.enrollments.reset_progress(user_id, course_id)
  await client.enrollments.get_default_class(course_id, school_id=...)
  ```
</CodeGroup>

| Method              | Returns        | Description                         |
| ------------------- | -------------- | ----------------------------------- |
| `list()`            | `Enrollment[]` | List enrollments for a user         |
| `enroll()`          | `Enrollment`   | Enroll a user in a course           |
| `unenroll()`        | `void`         | Remove user from a course           |
| `resetGoals()`      | `ResetResult`  | Reset goals for all users in course |
| `resetProgress()`   | `void`         | Reset a user's progress in a course |
| `getDefaultClass()` | `Class`        | Get the default class for a course  |

## Analytics

Student activity data and metrics.

<CodeGroup>
  ```typescript TypeScript theme={null}
  client.analytics.getActivity({ studentId, startDate, endDate, timezone? })
  client.analytics.getWeeklyFacts({ studentId, weekDate, timezone? })
  client.analytics.getEnrollmentFacts({ enrollmentId, startDate?, endDate?, timezone? })
  client.analytics.getHighestGradeMastered(studentId, subject)
  ```

  ```python Python theme={null}
  await client.analytics.get_activity(student_id=..., start_date=..., end_date=..., timezone=...)
  await client.analytics.get_weekly_facts(student_id=..., week_date=..., timezone=...)
  await client.analytics.get_enrollment_facts(enrollment_id=..., start_date=..., end_date=..., timezone=...)
  await client.analytics.get_highest_grade_mastered(student_id, subject)
  ```
</CodeGroup>

| Method                      | Returns           | Description                              |
| --------------------------- | ----------------- | ---------------------------------------- |
| `getActivity()`             | `ActivityData`    | Activity metrics grouped by date/subject |
| `getWeeklyFacts()`          | `WeeklyFacts`     | Weekly summary for a student             |
| `getEnrollmentFacts()`      | `EnrollmentFacts` | Aggregated facts for an enrollment       |
| `getHighestGradeMastered()` | `GradeMastery`    | Highest grade mastered in a subject      |

Activity data is keyed by date, then subject: `activity['2024-01-15']['Math'].xp`

## Users

User management with role-based filtering.

<CodeGroup>
  ```typescript TypeScript theme={null}
  client.users.list({ roles, ...params })
  client.users.listStudents(params?)
  client.users.listTeachers(params?)
  client.users.search(roles, searchTerm, limit?)
  ```

  ```python Python theme={null}
  await client.users.list(roles=roles, ...)
  await client.users.list_students(...)
  await client.users.list_teachers(...)
  await client.users.search(roles, search_term, limit=...)
  ```
</CodeGroup>

## Subject Tracks

K-12 curriculum sequence management.

<CodeGroup>
  ```typescript TypeScript theme={null}
  client.subjectTracks.list()
  client.subjectTracks.upsert(data)
  client.subjectTracks.delete(id)
  client.subjectTracks.listGroups()
  ```

  ```python Python theme={null}
  await client.subject_tracks.list()
  await client.subject_tracks.upsert(data)
  await client.subject_tracks.delete(id)
  await client.subject_tracks.list_groups()
  ```
</CodeGroup>

## Applications

<CodeGroup>
  ```typescript TypeScript theme={null}
  client.applications.list()
  client.applications.getMetrics(applicationSourcedId)
  ```

  ```python Python theme={null}
  await client.applications.list()
  await client.applications.get_metrics(application_sourced_id)
  ```
</CodeGroup>

| Method         | Returns         | Description                    |
| -------------- | --------------- | ------------------------------ |
| `list()`       | `Application[]` | List all applications          |
| `getMetrics()` | `AppMetrics`    | Get metrics for an application |

## Learning Reports

<CodeGroup>
  ```typescript TypeScript theme={null}
  client.learningReports.getMapProfile(userId)
  client.learningReports.getTimeSaved(userId)
  ```

  ```python Python theme={null}
  await client.learning_reports.get_map_profile(user_id)
  await client.learning_reports.get_time_saved(user_id)
  ```
</CodeGroup>

| Method            | Returns      | Description                |
| ----------------- | ------------ | -------------------------- |
| `getMapProfile()` | `MapProfile` | Get MAP profile for a user |
| `getTimeSaved()`  | `TimeSaved`  | Get time saved for a user  |

## Comparison with OneRoster

| Task           | OneRoster                                  | EduBridge                        |
| -------------- | ------------------------------------------ | -------------------------------- |
| Enroll user    | Create class, academic session, enrollment | Single `enroll()` call           |
| Get activity   | Query Caliper separately                   | `getActivity()` with aggregation |
| User search    | Filter with OneRoster syntax               | Role-based filtering with search |
| Reset progress | Delete individual results                  | Single `resetProgress()` call    |

Use EduBridge when you need simplified access to common queries. Use OneRoster when you need full control over rostering operations.

## Next Steps

<CardGroup cols={2}>
  <Card title="OneRoster" icon="users" href="/beta/build-on-timeback/clients/oneroster">
    Full rostering control
  </Card>

  <Card title="Caliper" icon="chart-line" href="/beta/build-on-timeback/clients/caliper">
    Learning event tracking
  </Card>

  <Card title="Types" icon="brackets-curly" href="/beta/api-reference/overview">
    EduBridge type definitions
  </Card>
</CardGroup>
