Competency Track

Assign competencies to students, validate mastery through assessments, and receive verifiable credentials — enabling outcomes-based education funding where payments are released only when validated learning outcomes are achieved.

What Is a Competency Track?

A competency track is a structured learning journey managed by TimeBack on behalf of an education funding provider. It connects four pieces:

  1. Competencies — specific learning standards (CASE CFItems) that define what a student must master
  2. Learning content — delivered by a provider app (e.g., Alpha Anywhere Math)
  3. Assessment — one or more mapped assessment applications that validate whether the student mastered the competencies
  4. Mastery credential — a verifiable token issued by TimeBack when the student demonstrates mastery

The funding provider (e.g., EduPaid) defines what competencies are in a track. The learning app provider delivers instruction. TimeBack orchestrates assessment and issues the mastery credential. Payouts are triggered only by verified mastery.

How It Works

Step 1 Step 2 Step 3 Step 4 Step 5
Provider defines a learning block Provider assigns the learning block to a student Student completes learning Provider triggers mastery assessment via API TimeBack issues mastery credential to funding provider
  1. The funding provider defines a learning block — a reusable template specifying the associated learning app and whether placement is required. For non-dynamic blocks, it also includes the competencies (CFItems). For dynamic blocks, competencies are determined per-student after placement.
  2. A parent purchases a learning track on the funding platform (e.g., EduPaid).
  3. The provider calls TimeBack's API to assign the learning block to the student.
  4. The student works through the learning content in the provider's app.
  5. When the provider determines the student is ready, it calls TimeBack's API to trigger a mastery assessment.
  6. The student completes the assessment(s). Assessment vendors report results to TimeBack via Caliper.
  7. If the student passes, TimeBack issues a mastery credential and notifies the funding provider via outbound Caliper.

Key Concepts

Learning Track vs. Learning Block

A learning track is a purchasable product on the funding platform — it represents a student's enrollment with a specific provider (e.g., "Alpha Anywhere Math"). A learning block is a reusable template defined via TimeBack's API. For non-dynamic blocks, it holds the specific competencies (CFItems) a student must master, along with the associated learning app and configuration. For dynamic blocks, it holds the learning app and CF subject reference — the competencies are determined per-student after placement. A single learning block definition can be assigned to many students. TimeBack operates on learning blocks; the funding platform manages learning tracks.

Dynamic vs. Non-Dynamic Tracks

  • Non-dynamic: The competencies (CFItems) are known at purchase time. The provider specifies them when defining the learning block. All students assigned the same block share the same competencies.
  • Dynamic: The competencies are unknown at purchase time. The learning block defines only the CF subject and configuration. When the block is assigned to a student, TimeBack conducts a placement test to determine the student's grade level, then assigns the appropriate CFItems to that student's assignment. Different students assigned the same dynamic block may receive different competencies based on their placement results.

Mastery Credential

When a student passes a mastery assessment, TimeBack issues a credential in Open Badges v3 format. This credential is delivered to the funding provider via an outbound Caliper GradeEvent. Only passing results generate credentials — failures are not reported to the funding provider, and students may retry assessments.

Proctoring

If an assessment requires proctoring (proctoringMode = 'on'), TimeBack verifies that the assessment session was proctored before issuing the mastery credential. Unproctored sessions for proctoring-required assessments are treated as failures — no credential is issued, and the student must retake the assessment under proctored conditions.

Prerequisites

Before integrating with competency track:

  1. Register your app with TimeBack as an LtiApplication (see Level 0: Registration)
  2. Obtain OAuth credentials with the appropriate competency-track scopes (see Authentication)
  3. Ensure CASE items exist — the competencies (CFItems) referenced in learning blocks must exist in TimeBack's CASE module, either as standard curricula (e.g., Common Core) or custom items created via the CASE API
  4. Set up assessment mappings — each competency must be mapped to an assessment application so TimeBack knows how to validate mastery
  5. Define learning blocks — create learning block definitions that specify the learning app and whether placement is required (for non-dynamic blocks, also include the competencies; for dynamic blocks, specify the CF subject for placement)

Communication Model

Direction Protocol What
Provider → TimeBack REST API Learning block definition, assignment, assessment mapping, assessment trigger, cancellation
Assessment Vendor → TimeBack Inbound Caliper Assessment results (AssessmentEvent, AssessmentItemEvent, GradeEvent)
TimeBack → Funding Provider Outbound Caliper Mastery credentials (GradeEvent)

API Endpoints

The competency track API provides endpoints for the core happy-path flow:

Endpoint Description
PUT /competency-track/1.0/learning-blocks/{sourcedId} Define or update a learning block template
POST /competency-track/1.0/assignments Assign a learning block to a student
POST /competency-track/1.0/assessment-mappings Map competencies to assessment apps
POST /competency-track/1.0/assessments Trigger a mastery assessment for a student

Authentication

All competency track endpoints require OAuth 2.0 authentication. Request the write scope:

scope: https://timeback-platform.trilogy.com/competency-track/scope/competency-track.write

Include your access token in all requests:

const response = await fetch('https://platform.timeback.com/competency-track/1.0/...', {
  headers: {
    'Content-Type': 'application/json',
    Authorization: `Bearer ${accessToken}`,
  },
});

Define a Learning Block

Create or update a learning block — a reusable template that specifies which competencies a student must master and how they will be assessed. A single learning block can be assigned to many students. If a learning block with the given sourcedId already exists, it is updated; otherwise, a new one is created.

Important: Updating a learning block does not affect existing student assignments. When a learning block is assigned to a student, the CFItems are copied onto the assignment as a point-in-time snapshot. If you later update the learning block's CFItems, students who were already assigned will retain their original competencies. Only new assignments created after the update will receive the updated CFItems.

PUT /competency-track/1.0/learning-blocks/{sourcedId}

Path parameters:

Parameter Type Description
sourcedId string UUID of the learning block to upsert

Request body:

Field Type Required Description
sourcedId string Yes Must match the sourcedId in the path
learningAppId string Yes sourcedId of the provider's LtiApplication delivering the content
isDynamic boolean Yes true for per-student placement; false for predefined competencies
cfItemIds string[] Yes (non-dynamic only) CASE CFItem sourcedIds defining the competencies. Omit for dynamic.
cfSubjectId string Yes (dynamic only) CASE CFSubject sourcedId for placement. Omit for non-dynamic.

Example — non-dynamic block:

const sourcedId = 'a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d';
const response = await fetch(`https://platform.timeback.com/competency-track/1.0/learning-blocks/${sourcedId}`, {
  method: 'PUT',
  headers: {
    'Content-Type': 'application/json',
    Authorization: `Bearer ${accessToken}`,
  },
  body: JSON.stringify({
    learningBlock: {
      sourcedId: 'a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d',
      learningAppId: 'f7e6d5c4-b3a2-4918-8f0e-1d2c3b4a5968',
      isDynamic: false,
      cfItemIds: [
        '3a4b5c6d-7e8f-4a9b-0c1d-2e3f4a5b6c7d',
        '4b5c6d7e-8f9a-4b0c-1d2e-3f4a5b6c7d8e',
        '5c6d7e8f-9a0b-4c1d-2e3f-4a5b6c7d8e9f',
      ],
    },
  }),
});

Example — dynamic block:

const sourcedId = 'b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e';
const response = await fetch(`https://platform.timeback.com/competency-track/1.0/learning-blocks/${sourcedId}`, {
  method: 'PUT',
  headers: {
    'Content-Type': 'application/json',
    Authorization: `Bearer ${accessToken}`,
  },
  body: JSON.stringify({
    learningBlock: {
      sourcedId: 'b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e',
      learningAppId: 'f7e6d5c4-b3a2-4918-8f0e-1d2c3b4a5968',
      isDynamic: true,
      cfSubjectId: 'c3d4e5f6-a7b8-4c9d-0e1f-2a3b4c5d6e7f',
    },
  }),
});

Response:

{
  "learningBlock": {
    "sourcedId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
    "learningAppId": "f7e6d5c4-b3a2-4918-8f0e-1d2c3b4a5968",
    "isDynamic": false,
    "cfItemIds": [
      "3a4b5c6d-7e8f-4a9b-0c1d-2e3f4a5b6c7d",
      "4b5c6d7e-8f9a-4b0c-1d2e-3f4a5b6c7d8e",
      "5c6d7e8f-9a0b-4c1d-2e3f-4a5b6c7d8e9f"
    ],
    "cfSubjectId": null
  }
}

Assign a Learning Block to a Student

Assign an existing learning block to a student. TimeBack creates a StudentLearningBlockAssignment to track the student's progress. The learning block's isDynamic flag determines what happens next:

  • Non-dynamic: TimeBack copies the CFItems from the learning block definition onto the assignment immediately.
  • Dynamic: TimeBack initiates the placement flow to determine the student's grade level. The assignment's CFItems remain empty until placement completes, at which point the resolved CFItems are stored on the assignment.
POST /competency-track/1.0/assignments

Request body:

Field Type Required Description
studentId string Yes OneRoster user sourcedId of the student
learningBlockId string Yes sourcedId of the learning block definition to assign

Example:

const response = await fetch('https://platform.timeback.com/competency-track/1.0/assignments', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    Authorization: `Bearer ${accessToken}`,
  },
  body: JSON.stringify({
    assignment: {
      studentId: 'd4e5f6a7-b8c9-4d0e-1f2a-3b4c5d6e7f80',
      learningBlockId: 'a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d',
    },
  }),
});

Response — non-dynamic assignment:

{
  "assignment": {
    "sourcedId": "e5f6a7b8-c9d0-4e1f-2a3b-4c5d6e7f8091",
    "studentId": "d4e5f6a7-b8c9-4d0e-1f2a-3b4c5d6e7f80",
    "learningBlockId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
    "cfItemIds": [
      "3a4b5c6d-7e8f-4a9b-0c1d-2e3f4a5b6c7d",
      "4b5c6d7e-8f9a-4b0c-1d2e-3f4a5b6c7d8e",
      "5c6d7e8f-9a0b-4c1d-2e3f-4a5b6c7d8e9f"
    ]
  }
}

Response — dynamic assignment (placement pending):

{
  "assignment": {
    "sourcedId": "f6a7b8c9-d0e1-4f2a-3b4c-5d6e7f809102",
    "studentId": "d4e5f6a7-b8c9-4d0e-1f2a-3b4c5d6e7f80",
    "learningBlockId": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e",
    "cfItemIds": []
  }
}

Define Assessment Mappings

Map competencies (CFItems) to assessment applications. This tells TimeBack which assessment app can validate mastery of each competency. When a mastery assessment is triggered, TimeBack uses these mappings to determine the correct assessment app for the student's assigned CFItems. Each CFItem maps to exactly one assessment application.

The request body is a map where each key is an assessment application sourcedId and each value is an array of CFItem sourcedIds that the assessment app validates. This allows defining all mappings for a learning block in a single call — including cases where multiple assessment apps are involved.

POST /competency-track/1.0/assessment-mappings

Request body:

Field Type Required Description
assessmentMappings Record<string, string[]> Yes Map of assessment app sourcedId → array of CFItem sourcedIds. Each key must be an LtiApplication with applicationType: ASSESSMENT.

Example:

const response = await fetch('https://platform.timeback.com/competency-track/1.0/assessment-mappings', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    Authorization: `Bearer ${accessToken}`,
  },
  body: JSON.stringify({
    assessmentMappings: {
      'b8c9d0e1-f2a3-4b4c-5d6e-7f8091021324': [
        '3a4b5c6d-7e8f-4a9b-0c1d-2e3f4a5b6c7d',
        '4b5c6d7e-8f9a-4b0c-1d2e-3f4a5b6c7d8e',
      ],
      'a9b0c1d2-e3f4-4a5b-6c7d-8e9f01234567': ['5c6d7e8f-9a0b-4c1d-2e3f-4a5b6c7d8e9f'],
    },
  }),
});

Response:

{
  "assessmentMappings": [
    {
      "sourcedId": "c9d0e1f2-a3b4-4c5d-6e7f-809102132435",
      "cfItemId": "3a4b5c6d-7e8f-4a9b-0c1d-2e3f4a5b6c7d",
      "assessmentAppId": "b8c9d0e1-f2a3-4b4c-5d6e-7f8091021324"
    },
    {
      "sourcedId": "d0e1f2a3-b4c5-4d6e-7f80-910213243546",
      "cfItemId": "4b5c6d7e-8f9a-4b0c-1d2e-3f4a5b6c7d8e",
      "assessmentAppId": "b8c9d0e1-f2a3-4b4c-5d6e-7f8091021324"
    },
    {
      "sourcedId": "e1f2a3b4-c5d6-4e7f-8091-021324354657",
      "cfItemId": "5c6d7e8f-9a0b-4c1d-2e3f-4a5b6c7d8e9f",
      "assessmentAppId": "a9b0c1d2-e3f4-4a5b-6c7d-8e9f01234567"
    }
  ]
}

Trigger a Mastery Assessment

Signal that a student has completed learning and is ready for mastery assessment. The provider (not TimeBack) determines when a student is ready based on its own curriculum completion logic. TimeBack validates that the student has an active assignment, looks up the mapped assessment applications for the assignment's competencies, and creates OneRosterUserProfile entries linking the student to each assessment app — enabling the student to launch the assessments via TimeBack.

POST /competency-track/1.0/assessments

Request body:

Field Type Required Description
assignmentId string Yes sourcedId of the student's StudentLearningBlockAssignment

Example:

const response = await fetch('https://platform.timeback.com/competency-track/1.0/assessments', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    Authorization: `Bearer ${accessToken}`,
  },
  body: JSON.stringify({
    assessment: {
      assignmentId: 'e5f6a7b8-c9d0-4e1f-2a3b-4c5d6e7f8091',
    },
  }),
});

Response:

{
  "assessment": {
    "sourcedId": "a7b8c9d0-e1f2-4a3b-4c5d-6e7f80910213",
    "assignmentId": "e5f6a7b8-c9d0-4e1f-2a3b-4c5d6e7f8091",
    "studentId": "d4e5f6a7-b8c9-4d0e-1f2a-3b4c5d6e7f80",
    "assessmentAppIds": ["b8c9d0e1-f2a3-4b4c-5d6e-7f8091021324", "a9b0c1d2-e3f4-4a5b-6c7d-8e9f01234567"]
  }
}

Event Payloads

After a mastery assessment is triggered via the API, the remaining flow is asynchronous and communicated via Caliper events. The assessment vendor reports results to TimeBack, and if the student passes, TimeBack delivers the mastery credential to the funding provider.

Assessment Results (Inbound)

After a mastery assessment is triggered, the assessment vendor reports the student's interaction and results to TimeBack via inbound Caliper events. The provider does not send these events — they are sent by the assessment application (e.g., NWEA MAP). This section is included so integrators understand what triggers the mastery credential flow.

The assessment vendor must send the following events during and after the assessment:

  1. AssessmentEventStarted when the student begins the assessment, and Submitted when the student completes it. The Submitted event is the trigger that causes TimeBack to evaluate whether the student passed.
  2. AssessmentItemEventStarted and Completed for each individual question within the assessment.
  3. GradeEvent with scoreType: QUESTION_RESULT — for each graded question, reporting scoreGiven and maxScore. TimeBack aggregates these item-level results to determine the student's overall score and whether they met the pass threshold.

For complete event schemas, field requirements, and sample payloads, see Assessment Interaction and Results in the Caliper Events Reference.

Mastery Credential (Outbound)

When TimeBack determines that a student has passed a mastery assessment (and proctoring requirements are met, if applicable), TimeBack issues a mastery credential and delivers it to the funding provider via an outbound Caliper GradeEvent with action: Graded.

Only passing results generate this event. Failures are not reported — the student may retry the assessment.

GradeEvent Schema

Key fields:

Field Description
type GradeEvent
action Graded
actor The student, formatted as urn:uuid:{studentPlatformId}
object The assessment Attempt that was graded
object.assignable The student's assignment, formatted as urn:uuid:{assignmentId}
generated A Score indicating the student passed
extensions.credential The Open Badges v3 mastery credential

Sample payload:

{
  "@context": "http://purl.imsglobal.org/ctx/caliper/v1p2",
  "id": "urn:uuid:b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e",
  "type": "GradeEvent",
  "actor": "urn:uuid:d4e5f6a7-b8c9-4d0e-1f2a-3b4c5d6e7f80",
  "action": "Graded",
  "object": {
    "id": "urn:uuid:b48cf3a7-833e-48e2-a6b8-6c31b1cf83e7",
    "type": "Attempt",
    "assignee": "urn:uuid:d4e5f6a7-b8c9-4d0e-1f2a-3b4c5d6e7f80",
    "assignable": "urn:uuid:e5f6a7b8-c9d0-4e1f-2a3b-4c5d6e7f8091"
  },
  "generated": {
    "id": "urn:uuid:c3d4e5f6-a7b8-4c9d-0e1f-2a3b4c5d6e7f",
    "type": "Score",
    "attempt": "urn:uuid:b48cf3a7-833e-48e2-a6b8-6c31b1cf83e7",
    "maxScore": 100,
    "scoreGiven": 100
  },
  "eventTime": "2026-02-25T10:50:00.000Z",
  "edApp": "urn:uuid:a0b1c2d3-e4f5-4a6b-7c8d-9e0f1a2b3c4d",
  "extensions": {
    "credential": {
      "@context": "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json",
      "type": "AchievementCredential",
      "id": "urn:uuid:f20634f7-0dbf-474b-94e0-e8e3b4b28da6",
      "issuer": {
        "type": "Profile",
        "id": "https://platform.timeback.com",
        "name": "TimeBack Platform"
      },
      "validFrom": "2026-02-25T10:50:00.000Z",
      "credentialSubject": {
        "type": "AchievementSubject",
        "achievement": {
          "type": "Achievement",
          "id": "https://platform.timeback.com/ims/clr/v2p0/achievements/f20634f7-0dbf-474b-94e0-e8e3b4b28da6",
          "name": "Math Mastery — 3rd Grade"
        }
      }
    }
  }
}

Authentication

Obtain OAuth client credentials and access tokens required for calling competency track endpoints.

Curriculum Management

Define and manage curriculum structures (subjects, documents, items, and hierarchies) using the CASE 1.1 API — the source of the CFItems referenced in learning blocks.

Caliper Events Reference

Complete event schemas, field requirements, and examples for assessment events and grading.