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:
- Competencies — specific learning standards (CASE CFItems) that define what a student must master
- Learning content — delivered by a provider app (e.g., Alpha Anywhere Math)
- Assessment — one or more mapped assessment applications that validate whether the student mastered the competencies
- 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 |
- 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.
- A parent purchases a learning track on the funding platform (e.g., EduPaid).
- The provider calls TimeBack's API to assign the learning block to the student.
- The student works through the learning content in the provider's app.
- When the provider determines the student is ready, it calls TimeBack's API to trigger a mastery assessment.
- The student completes the assessment(s). Assessment vendors report results to TimeBack via Caliper.
- 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:
- Register your app with TimeBack as an
LtiApplication(see Level 0: Registration) - Obtain OAuth credentials with the appropriate competency-track scopes (see Authentication)
- 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
- Set up assessment mappings — each competency must be mapped to an assessment application so TimeBack knows how to validate mastery
- 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:
- AssessmentEvent —
Startedwhen the student begins the assessment, andSubmittedwhen the student completes it. TheSubmittedevent is the trigger that causes TimeBack to evaluate whether the student passed. - AssessmentItemEvent —
StartedandCompletedfor each individual question within the assessment. - GradeEvent with
scoreType: QUESTION_RESULT— for each graded question, reportingscoreGivenandmaxScore. 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.
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"
}
}
}
}
}
Related Docs
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.
