Events Alpha customer specification

Student activity moments, plain enough for a teacher and exact enough for an LLM.

Events is the activity stream. It records that something happened: an app opened, content was viewed, a hint was requested, a question was answered, a video was scrubbed, an assessment was submitted, attendance was recorded, or a discipline incident was logged. Events can feed Results and operations dashboards, but Events never becomes a score, mastery state, gradebook rollup, content object, roster record, discipline sanction, or transcript outcome.

Events Alpha flow from source app to activity stream Source appactivitySource Send momentsPOST /events Activity streamevent Typed linkseventLink Resultsseparate
9public Events operationsplus demo token helper
9public or documented objectsincluding policy config
59public fieldsall dictionary-linked
32Alpha governed valuesplain event vocabulary
28architecture ITDschange and API-axis trace
StripeAPI benchmarkauth, errors, schemas, examples
Quickstart

One page to send a moment and read it back

The implementation deliverable must make these commands work at the reserved canonical base URL. The demo helper mints only for tenantId=demo; real-tenant tokens are minted by the operator path described in the platform docs. The example generates one HAPPENED_AT value and derives the last-24-hours read filter from that same event time, so the event you just posted is inside the query window whenever you run it.

export EVENTS_BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/events/alpha/implementation/api"
export EVENTS_TOKEN="$(curl -s -X POST "$EVENTS_BASE_URL/dev/mint?tenantId=demo" | node -e 'let s="";process.stdin.on("data",d=>s+=d);process.stdin.on("end",()=>console.log(JSON.parse(s).token))')"
export RUN_ID="$(node -e 'console.log(require("node:crypto").randomUUID())')"
export HAPPENED_AT="$(node -e 'console.log(new Date().toISOString())')"

cat > events.json <<JSON
{
  "events": [
    {
      "sourceEventId": "urn:uuid:$RUN_ID",
      "kind": "question_answered",
      "eventType": "AssessmentItemEvent",
      "profile": "AssessmentProfile",
      "action": "Completed",
      "actorRef": {
        "id": "https://timeback.example.edu/users/student-1",
        "type": "Person"
      },
      "studentId": "student-ada-001",
      "objectRef": {
        "id": "https://timeback.example.edu/items/fractions-1",
        "type": "AssessmentItem",
        "name": "Fractions check"
      },
      "contentId": "content-fractions-video-01",
      "activitySourceId": "2fb3d3d9-a9f0-49ac-9ef7-5d2d1d0b1001",
      "happenedAt": "$HAPPENED_AT",
      "extensions": {
        "https://timeback.example.edu/extensions/outcomeScore": 1
      }
    }
  ]
}
JSON

curl -X POST "$EVENTS_BASE_URL/events" \
  -H "Authorization: Bearer $EVENTS_TOKEN" \
  -H "X-Timeback-Tenant: demo" \
  -H "Idempotency-Key: events-demo-$RUN_ID" \
  -H "Content-Type: application/json" \
  -d @events.json

SINCE="$(node -e 'console.log(new Date(Date.parse(process.env.HAPPENED_AT) - 24*60*60*1000).toISOString())')"
curl "$EVENTS_BASE_URL/events?studentId=student-ada-001&kind=question_answered&happenedAtFrom=$SINCE&pageSize=50" \
  -H "Authorization: Bearer $EVENTS_TOKEN" \
  -H "X-Timeback-Tenant: demo"
Boundary that keeps Events honest. The response can prove a question was answered. It must not contain score, mastery, working grade, report-card rollup, MAP, or content-effectiveness counters. Those live in Results or Content.
Client Samples

Shipping clients need more than cURL

These examples perform the same cold-start job as the quickstart: mint a demo token, send one question_answered event with a per-run Idempotency-Key, then read the student's question_answered events from the last 24 hours using the same happenedAt value they posted. Error handling keeps the full Problem JSON so clients can distinguish 409, 412, and 422.

JavaScript

import { randomUUID } from "node:crypto";

const EVENTS_BASE_URL = "https://platform3-andymontgomery-9773s-projects.vercel.app/events/alpha/implementation/api";

async function eventsRequest(path, { method = "GET", token, body, idempotencyKey } = {}) {
  const response = await fetch(`${EVENTS_BASE_URL}${path}`, {
    method,
    headers: {
      "Authorization": `Bearer ${token}`,
      "X-Timeback-Tenant": "demo",
      ...(idempotencyKey ? { "Idempotency-Key": idempotencyKey } : {}),
      ...(body ? { "Content-Type": "application/json" } : {})
    },
    body: body ? JSON.stringify(body) : undefined
  });
  const payload = await response.json();
  if (!response.ok) {
    throw Object.assign(new Error(payload.title || "Events API error"), { status: response.status, problem: payload });
  }
  return payload;
}

const mint = await fetch(`${EVENTS_BASE_URL}/dev/mint?tenantId=demo`, { method: "POST" }).then((r) => r.json());
const runId = randomUUID();
const happenedAt = new Date().toISOString();
const eventBody = {
  "events": [
    {
      "sourceEventId": `urn:uuid:${runId}`,
      "kind": "question_answered",
      "eventType": "AssessmentItemEvent",
      "profile": "AssessmentProfile",
      "action": "Completed",
      "actorRef": {
        "id": "https://timeback.example.edu/users/student-1",
        "type": "Person"
      },
      "studentId": "student-ada-001",
      "objectRef": {
        "id": "https://timeback.example.edu/items/fractions-1",
        "type": "AssessmentItem",
        "name": "Fractions check"
      },
      "contentId": "content-fractions-video-01",
      "activitySourceId": "2fb3d3d9-a9f0-49ac-9ef7-5d2d1d0b1001",
      "happenedAt": happenedAt,
      "extensions": {
        "https://timeback.example.edu/extensions/outcomeScore": 1
      }
    }
  ]
};

await eventsRequest("/events", {
  method: "POST",
  token: mint.token,
  idempotencyKey: `question-answer-${runId}`,
  body: eventBody
});

const since = new Date(Date.parse(happenedAt) - 24 * 60 * 60 * 1000).toISOString();
const activity = await eventsRequest(
  `/events?studentId=student-ada-001&kind=question_answered&happenedAtFrom=${encodeURIComponent(since)}&pageSize=50`,
  { token: mint.token }
);
console.log(JSON.stringify(activity.data, null, 2));

Python

import datetime
import json
import uuid
import requests

EVENTS_BASE_URL = "https://platform3-andymontgomery-9773s-projects.vercel.app/events/alpha/implementation/api"

def events_request(path, token, method="GET", body=None, idempotency_key=None):
    headers = {
        "Authorization": f"Bearer {token}",
        "X-Timeback-Tenant": "demo",
    }
    if idempotency_key:
        headers["Idempotency-Key"] = idempotency_key
    if body is not None:
        headers["Content-Type"] = "application/json"
    response = requests.request(method, f"{EVENTS_BASE_URL}{path}", headers=headers, json=body, timeout=20)
    payload = response.json()
    if not response.ok:
        raise RuntimeError({"status": response.status_code, "problem": payload})
    return payload

token = requests.post(f"{EVENTS_BASE_URL}/dev/mint?tenantId=demo", timeout=20).json()["token"]
run_id = uuid.uuid4()
happened_at = datetime.datetime.now(datetime.UTC).isoformat().replace("+00:00", "Z")
event_body = {
  "events": [
    {
      "sourceEventId": f"urn:uuid:{run_id}",
      "kind": "question_answered",
      "eventType": "AssessmentItemEvent",
      "profile": "AssessmentProfile",
      "action": "Completed",
      "actorRef": {
        "id": "https://timeback.example.edu/users/student-1",
        "type": "Person"
      },
      "studentId": "student-ada-001",
      "objectRef": {
        "id": "https://timeback.example.edu/items/fractions-1",
        "type": "AssessmentItem",
        "name": "Fractions check"
      },
      "contentId": "content-fractions-video-01",
      "activitySourceId": "2fb3d3d9-a9f0-49ac-9ef7-5d2d1d0b1001",
      "happenedAt": happened_at,
      "extensions": {
        "https://timeback.example.edu/extensions/outcomeScore": 1
      }
    }
  ]
}

events_request(
    "/events",
    token,
    method="POST",
    idempotency_key=f"question-answer-{run_id}",
    body=event_body
)

since = (datetime.datetime.fromisoformat(happened_at.replace("Z", "+00:00")) - datetime.timedelta(hours=24)).isoformat().replace("+00:00", "Z")
activity = events_request(
    f"/events?studentId=student-ada-001&kind=question_answered&happenedAtFrom={since}&pageSize=50",
    token
)
print(json.dumps(activity["data"], indent=2))
Authentication

Bearer token plus explicit tenant, with source secrets kept out of schema.

Events inherits platform auth and tenant routing, then applies Events scopes and relationship boundaries for reads. Activity source credentials are operational secrets, not fields, not tags, and never returned.

ControlRequirementApplies toTrace
Bearer JWTEvery public Events operation requires HTTPS and Authorization: Bearer $EVENTS_TOKEN, except the demo-only token helper.All Events operationsEAITD-106, PITD-005-AUTH-TENANT-SCOPE
X-Timeback-TenantThe header must match the JWT tenant claim. The tenant is not inferred from actor, org, content, or payload fields.All Events operationsEAITD-109
Events scopesWrites require a trusted source/app scope. Reads are filtered by tenant, role, and optional student/org/content boundary claims.POST /events and readsEAITD-106, EAITD-010
Idempotency-KeyOptional on POST /events. Same key and same request returns the original outcome; same key with different content returns 409.POST /eventsEAITD-105, PITD-007-IDEMPOTENCY-AND-CONCURRENCY
Activity source credentialscredentialRef is internal and points to managed secret material. Public Alpha returns only id, sourceIri, name, status, createdAt, and updatedAt.activitySourceEAITD-004, activitySource.id, activitySource.status
Errors

Problem JSON is stable and redacted.

Errors use the shared platform Problem shape with Events-specific codes where needed. Problem detail can name invalid Alpha fields and allowed value sets, but it must not echo bearer tokens, source credentials, raw Caliper payloads, IP addresses, user agents, direct learner PII, or unredacted entity names.

StatusNameWhen Events returns itTrace
200OKRead operations returned visible JSON.EAITD-108, PITD-006-HTTP-ENVELOPE-AND-ERRORS
202AcceptedPOST /events accepted the batch and returns safe eventBatch status plus visible event projections.EAITD-108, PITD-006-HTTP-ENVELOPE-AND-ERRORS
400Bad RequestMalformed JSON, invalid query parameter, invalid timestamp shape, missing required body field, or source-import request validation failure (events:validation_failed).EAITD-108, PITD-006-HTTP-ENVELOPE-AND-ERRORS
401UnauthorizedMissing, expired, malformed, untrusted, or unsigned Bearer token.EAITD-108, PITD-006-HTTP-ENVELOPE-AND-ERRORS
403ForbiddenToken is valid but not allowed for this tenant, source, scope, student, org, or content boundary.EAITD-108, PITD-006-HTTP-ENVELOPE-AND-ERRORS
404Not FoundRequested event or activity source does not exist or is not visible inside the authenticated tenant scope.EAITD-108, PITD-006-HTTP-ENVELOPE-AND-ERRORS
409ConflictIdempotency-Key, importId, or sourceEventId replay conflicts with different content.EAITD-108, PITD-006-HTTP-ENVELOPE-AND-ERRORS
412Precondition FailedA documented conditional request precondition evaluates false. Events has no mutable update route today, so normal POST /events retries use 409 for idempotency conflicts, not 412.EAITD-108, PITD-006-HTTP-ENVELOPE-AND-ERRORS
415Unsupported Media TypePOST /events was not sent as application/json.EAITD-108, PITD-006-HTTP-ENVELOPE-AND-ERRORS
422Unprocessable ContentEvent shape parses but Caliper vocabulary, Alpha kind mapping, relationship resolution, policy config, privacy validation, source-row adapter mapping, descriptor resolution, or module routing fails.EAITD-108, PITD-006-HTTP-ENVELOPE-AND-ERRORS
500Server ErrorUnexpected platform, dependency, projection, storage, or policy failure. Problem JSON stays redacted.EAITD-108, PITD-006-HTTP-ENVELOPE-AND-ERRORS

Problem response schema

FieldTypeRequiredMeaningTrace
typeurlRequiredStable Problem URI.EAITD-108, PITD-027-API-AXIS-ERROR-ENVELOPE
codestringRequiredStable machine code such as invalid_event_kind, unauthorized, forbidden, conflict, or not_found.EAITD-108, PITD-027-API-AXIS-ERROR-ENVELOPE
titlestringRequiredPlain title a teacher, support person, or LLM can act on.EAITD-108
statusintegerRequiredHTTP status repeated in the body.EAITD-108, PITD-006-HTTP-ENVELOPE-AND-ERRORS
detailstringRequiredSafe explanation. Must not include secrets, raw payload, or direct PII.EAITD-010, EAITD-108
requestIdstringRequiredSupport-safe request identifier.PITD-006-HTTP-ENVELOPE-AND-ERRORS
traceIdstringRequiredSupport-safe trace identifier.PITD-006-HTTP-ENVELOPE-AND-ERRORS
fieldErrorsarray<object>OptionalField-level errors using Alpha field paths and allowed value set names.EAITD-108, alpha_event_kind

Example Problems

Use the status plus code to branch. 422 means the event content is invalid, 409 means a retry/idempotency identity conflicts with different content, and 412 means a conditional request precondition failed. Current Events clients normally do not send If-Match because Events has no public update route.

422 invalid event kind

{
  "type": "https://platform.timeback.com/problems/events/invalid-event-kind",
  "code": "invalid_event_kind",
  "title": "Event kind is not in the Events registry",
  "status": 422,
  "detail": "Use one of the documented alpha_event_kind values. Do not send a display label or a source-specific string.",
  "requestId": "req_01JYW6Y2F2P3RB4G8HTP7K2M1Q",
  "traceId": "trc_01JYW6Y2F2P3RB4G8HTP7K2M1Q",
  "fieldErrors": [
    {
      "path": "events[0].kind",
      "code": "value_not_allowed",
      "allowedValueSet": "alpha_event_kind"
    }
  ]
}

409 idempotency conflict

{
  "type": "https://platform.timeback.com/problems/events/idempotency-conflict",
  "code": "idempotency_conflict",
  "title": "Idempotency key was reused with different content",
  "status": 409,
  "detail": "This Idempotency-Key already belongs to a different POST /events request. Retry with the original body or choose a new key for this event batch.",
  "requestId": "req_01JYW73G1Y5F4VX6X6VRB9P0CK",
  "traceId": "trc_01JYW73G1Y5F4VX6X6VRB9P0CK",
  "fieldErrors": [
    {
      "path": "headers.Idempotency-Key",
      "code": "same_key_different_request",
      "allowedValueSet": null
    }
  ]
}

412 precondition failed

{
  "type": "https://platform.timeback.com/problems/events/precondition-failed",
  "code": "precondition_failed",
  "title": "Conditional request precondition failed",
  "status": 412,
  "detail": "Events are immutable append records, so current Events clients should not send If-Match for POST /events. If a future correction route ships, stale or mismatched validators fail as 412 rather than 409 idempotency conflict or 422 validation.",
  "requestId": "req_01JYW78BSK6D1H7G9X2K9TMN0J",
  "traceId": "trc_01JYW78BSK6D1H7G9X2K9TMN0J",
  "fieldErrors": [
    {
      "path": "headers.If-Match",
      "code": "precondition_failed",
      "allowedValueSet": null
    }
  ]
}

400 source import validation

{
  "type": "https://platform.timeback.com/problems/events/source-import-validation-failed",
  "code": "events:validation_failed",
  "title": "Source import request is not valid",
  "status": 400,
  "detail": "records must contain 1..1000 source-shaped rows for the named adapter.",
  "requestId": "req_01JZ0D8J93FNGN52S3K20SJ1F8",
  "traceId": "trc_01JZ0D8J93FNGN52S3K20SJ1F8",
  "fieldErrors": [
    {
      "path": "records",
      "code": "array_size_out_of_range",
      "allowedValueSet": "sourceIngestContract.requestFields.records"
    }
  ]
}

422 source import adapter rejected

{
  "type": "https://platform.timeback.com/problems/events/source-import-adapter-rejected",
  "code": "events:adapter_rejected",
  "title": "Source row cannot become an Events row",
  "status": 422,
  "detail": "The source row points at an unknown student sourced_id. Fix People & Orgs or route the row to the owning module; do not pre-normalize around the adapter.",
  "requestId": "req_01JZ0DD5BK4YV7P9A5N1Y41J48",
  "traceId": "trc_01JZ0DD5BK4YV7P9A5N1Y41J48",
  "fieldErrors": [
    {
      "path": "records[0].student_sourced_id",
      "code": "unknown_roster_reference",
      "allowedValueSet": null
    }
  ]
}
Source Ingest

Migration sends source-shaped rows; Events does the platform work.

Production migration is the first real app the Alpha skill pack must build. The caller sends TimeBack Production or Horizons SIS rows as they exist at the source. The Events surface owns normalization, dedupe, descriptor resolution, relationship keys, materialization, and Problem statuses.

POST /source-imports. Migration-only raw-ingest adapter for production source rows. The caller sends raw TimeBack or Horizons rows in their source shape; Events Alpha performs all mapping, validation, dedupe, descriptor resolution, and Caliper/Ed-Fi materialization server-side. 200 OK only after the accepted records are committed and immediately readable through the public Alpha read endpoints. The caller must not pre-normalize Caliper eventType/profile/action/kind, Ed-Fi descriptors, People & Orgs joins, Content joins, minute buckets, dedupe hashes, or event/result boundaries. If the migration client has to compute those, the surface leaked.

Request fields

FieldTypeRequiredMeaningInvalid when
sourceSystemenumRequiredThe production system that produced the raw records.
Allowed: timeback_production, horizons_sis
Missing, free text, names a test fixture, or names nwea_map / assessment score data that belongs in Results.
adapterenumRequiredThe named server-side adapter to run for every record in this import.
Allowed: timeback_learning_event_v1, horizons_attendance_event_v1, horizons_discipline_event_v1
Missing, not supported for the sourceSystem, or asks Events to ingest Results-owned scores or MAP rows.
importIdtextOptionalCaller-supplied idempotency label for the migration run, used only as import evidence and retry correlation.
Allowed: Stable string, 1-120 characters.
Used to route tenant scope, contains PII beyond source-run identity, or changes meaning across retries.
recordsarray<object>RequiredRaw production rows exactly as TimeBack Production or Horizons SIS returns them.
Allowed: 1..1000 source-shaped records per request.
Empty, over batch limit, already rewritten into Alpha event objects, or contains secrets/tokens.
dryRunbooleanOptionalValidate and preview adapter decisions without writing rows.
Allowed: true or false; default false.
The caller treats dryRun=true as migrated data or uses dryRun=false with no readable rows.

Adapters

AdapterSourceAcceptsServer normalizesMaterializesRejects
timeback_learning_event_v1timeback_productionRaw TimeBack learning activity / processed-fact event rows that say a student launched an app, viewed content, scrubbed video, requested a hint, answered a question, completed a lesson, started/submitted an assessment, searched, viewed feedback, or joined a session.sourceEventId, eventType, profile, action, kind, actorRef, objectRef, studentId, contentId, orgId, happenedAt, activitySourceId, Caliper envelope, Caliper event, entity links, and alpha.event_extension relationship keys.Rows visible through GET /events and alpha.event_view at public event grain.Assessment scores, MAP rows, mastery facts, XP awards, course completion percentages, or anything that is a durable Results statement.
horizons_attendance_event_v1horizons_sisRaw Horizons attendance rows for a student, school/class, date, attendance category, arrival/departure times, and duration.Ed-Fi canonical attendance record, descriptor resolution through the governed Ed-Fi descriptor registry, student/school/class sourcedId links, soft-delete state, and eventDate.Rows visible through GET /attendance-events and alpha.attendance_event_view.Guardians, program participation, transcript grades, discipline rows, or attendance rows whose student sourced_id is unknown to People & Orgs.
horizons_discipline_event_v1horizons_sisRaw Horizons discipline incident / student behavior association rows for a student, school, incident date/time, behavior, participation code, and location.Ed-Fi canonical discipline record, governed behavior/location/participation descriptors, redacted narrative handling, soft-delete state, and incidentDate.Rows visible through GET /discipline-events and alpha.discipline_event_view.Transcript/grade records, program participation, guardians, attendance rows, or discipline rows whose student sourced_id is unknown to People & Orgs.

Problem statuses

CodeHTTPWhenCaller fix
events:validation_failed400The request envelope is malformed before adapter semantics run: invalid JSON, missing sourceSystem/adapter/records, empty records, unsupported query/path fields, records over the documented batch limit, tenant header/token mismatch shape, or dryRun not boolean.Fix the request shape. Do not retry unchanged. The response includes requestId, traceId, and fieldErrors[] with safe paths only.
events:adapter_rejected422The request envelope is valid but one or more source rows cannot become Events rows: unknown student sourced_id, unknown content/activity reference, unmapped TimeBack activity type, Horizons descriptor not in the governed registry, source row belongs to Results/People & Orgs/Content/Curriculum instead of Events, or source row would require client-side platform logic.Route the source row to the named owning module or fix upstream reference data. Do not pre-normalize around the adapter.
idempotency_conflict409The same Idempotency-Key or importId is reused with different records or adapter parameters.Use the original payload for replay or start a new import id/key for a different source cut.

Materialization checks

  • After timeback_learning_event_v1 success, GET /events?studentId={studentId}&modifiedSince={importStartedAt} returns the accepted event ids or the import is failed.
  • After horizons_attendance_event_v1 success, GET /attendance-events?studentId={studentId}&from={firstDate}&to={afterLastDate} returns the accepted attendance ids or the import is failed.
  • After horizons_discipline_event_v1 success, GET /discipline-events?studentId={studentId}&from={firstDate}&to={afterLastDate} returns the accepted discipline ids or the import is failed.
  • HTTP 200 with a Problem body, acceptedCount > materializedCount, or acceptedCount > 0 with zero readable rows is a lying success and fails the raw-ingest gate.

Source-shaped request

{
  "sourceSystem": "timeback_production",
  "adapter": "timeback_learning_event_v1",
  "importId": "duke-2025-26-events-a1",
  "records": [
    {
      "id": "pf_918271",
      "student_sourced_id": "b6fa7128-f641-4efd-9075-375411fd6c39",
      "activity_id": "fractions_video_482",
      "activity_kind": "video_scrub",
      "occurred_at": "2026-02-12T15:04:03Z",
      "course_ref": "math-5-fractions"
    }
  ]
}

Successful materialization response

{
  "data": {
    "importId": "duke-2025-26-events-a1",
    "sourceSystem": "timeback_production",
    "adapter": "timeback_learning_event_v1",
    "acceptedCount": 1,
    "rejectedCount": 0,
    "materializedCount": 1,
    "dryRun": false,
    "readable": [
      {
        "resource": "events",
        "href": "/events?studentId=b6fa7128-f641-4efd-9075-375411fd6c39&modifiedSince=2026-02-12T15:04:00Z",
        "ids": [
          "b9f6dd89-b024-4d1d-a0c5-c923aab41001"
        ]
      }
    ]
  }
}
Workflows

Customer jobs the implementation must satisfy

01

Import TimeBack source events without pre-normalizing

Send raw TimeBack Production learning-event rows and let Events Alpha derive Caliper tuples, Alpha kind, relationship keys, dedupe evidence, and public view rows.

Customer
Migration app or app-builder LLM
Operations
/source-imports, /events
Fields
event.kind, event.studentId, event.contentId, event.receivedAt
Trace
EAITD-005, EAITD-007, EAITD-008, EAITD-108
curl -sS -X POST "$EVENTS_BASE_URL/source-imports" \
  -H "Authorization: Bearer $EVENTS_TOKEN" \
  -H "X-Timeback-Tenant: demo" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: duke-2025-26-events-source-import-a1" \
  -d '{
  "sourceSystem": "timeback_production",
  "adapter": "timeback_learning_event_v1",
  "importId": "duke-2025-26-events-a1",
  "records": [
    {
      "id": "pf_918271",
      "student_sourced_id": "b6fa7128-f641-4efd-9075-375411fd6c39",
      "activity_id": "fractions_video_482",
      "activity_kind": "video_scrub",
      "occurred_at": "2026-02-12T15:04:03Z",
      "course_ref": "math-5-fractions"
    }
  ]
}'
02

Send a question answer moment

Record that a student answered a question without writing a score into Events.

Customer
Learning app
Operations
/events, /events/{eventId}
Fields
event.kind, event.studentId, event.contentId, event.happenedAt
Trace
EAITD-003, EAITD-005, EAITD-007
export RUN_ID="$(node -e 'console.log(require("node:crypto").randomUUID())')"
export HAPPENED_AT="$(node -e 'console.log(new Date().toISOString())')"

cat > events.json <<JSON
{
  "events": [
    {
      "sourceEventId": "urn:uuid:$RUN_ID",
      "kind": "question_answered",
      "eventType": "AssessmentItemEvent",
      "profile": "AssessmentProfile",
      "action": "Completed",
      "actorRef": {
        "id": "https://timeback.example.edu/users/student-1",
        "type": "Person"
      },
      "studentId": "student-ada-001",
      "objectRef": {
        "id": "https://timeback.example.edu/items/fractions-1",
        "type": "AssessmentItem",
        "name": "Fractions check"
      },
      "contentId": "content-fractions-video-01",
      "activitySourceId": "2fb3d3d9-a9f0-49ac-9ef7-5d2d1d0b1001",
      "happenedAt": "$HAPPENED_AT",
      "extensions": {
        "https://timeback.example.edu/extensions/outcomeScore": 1
      }
    }
  ]
}
JSON

curl -X POST "$EVENTS_BASE_URL/events" \
  -H "Authorization: Bearer $EVENTS_TOKEN" \
  -H "X-Timeback-Tenant: demo" \
  -H "Idempotency-Key: question-answer-$RUN_ID" \
  -H "Content-Type: application/json" \
  -d @events.json
03

Build a student's moments-today report

List today's app opens, views, video activity, hints, and answers for one student.

Customer
Teacher or parent-facing app
Operations
/events
Fields
event.studentId, event.kind, event.happenedAt, event.receivedAt
Trace
EAITD-009, EAITD-103, EAITD-107
export TO_TIME="$(node -e 'console.log(new Date().toISOString())')"
export FROM_TIME="$(node -e 'const d=new Date(); d.setUTCHours(0,0,0,0); console.log(d.toISOString())')"

curl "$EVENTS_BASE_URL/events?studentId=student-ada-001&happenedAtFrom=$FROM_TIME&happenedAtTo=$TO_TIME&pageSize=50" \
  -H "Authorization: Bearer $EVENTS_TOKEN" \
  -H "X-Timeback-Tenant: demo"
05

Poll for new activity

Refresh an activity feed without re-reading the entire stream or implementing webhooks.

Customer
Dashboard or automation
Operations
/events
Fields
event.receivedAt, eventsPolicy.pageSize
Trace
EAITD-103, EAITD-107, EAITD-112
export MODIFIED_SINCE="$(node -e 'const d=new Date(Date.now()-15*60*1000); console.log(d.toISOString())')"

curl "$EVENTS_BASE_URL/events?modifiedSince=$MODIFIED_SINCE&pageSize=50" \
  -H "Authorization: Bearer $EVENTS_TOKEN" \
  -H "X-Timeback-Tenant: demo"
06

Read a student's attendance week

List school-day and section attendance moments without learning Ed-Fi resource names or descriptor tables.

Customer
Attendance dashboard or family-facing app
Operations
/attendance-events, /attendance-events/{attendanceEventId}
Fields
attendanceEvent.studentId, attendanceEvent.eventDate, attendanceEvent.category, attendanceEvent.isDeleted
Trace
EAITD-014, EAITD-016, EAITD-103
export TO_DATE="$(node -e 'console.log(new Date().toISOString().slice(0,10))')"
export FROM_DATE="$(node -e 'const d=new Date(); d.setUTCDate(d.getUTCDate()-7); console.log(d.toISOString().slice(0,10))')"

curl "$EVENTS_BASE_URL/attendance-events?studentId=student-ada-001&from=$FROM_DATE&to=$TO_DATE&pageSize=50" \
  -H "Authorization: Bearer $EVENTS_TOKEN" \
  -H "X-Timeback-Tenant: demo"
07

Review discipline moments safely

List discipline moments with governed behavior and participation values while keeping sensitive narrative text redacted.

Customer
School operations app or authorized staff workflow
Operations
/discipline-events, /discipline-events/{disciplineEventId}
Fields
disciplineEvent.studentId, disciplineEvent.incidentDate, disciplineEvent.behavior, disciplineEvent.description
Trace
EAITD-015, EAITD-016, EAITD-111
export TO_DATE="$(node -e 'console.log(new Date().toISOString().slice(0,10))')"
export FROM_DATE="$(node -e 'const d=new Date(); d.setUTCDate(d.getUTCDate()-30); console.log(d.toISOString().slice(0,10))')"

curl "$EVENTS_BASE_URL/discipline-events?studentId=student-ada-001&from=$FROM_DATE&to=$TO_DATE&pageSize=50" \
  -H "Authorization: Bearer $EVENTS_TOKEN" \
  -H "X-Timeback-Tenant: demo"
Two First-Class Paths

Ask Events through the API or through the raw database and get the same answer.

The Alpha API is the simplest path for app builders. The raw database path is equally first-class for agents and staff engineers who have database access. Use event, attendanceEvent, and disciplineEvent through the documented public view grain, not raw Caliper envelopes, Ed-Fi draft rows, or payload JSON, and apply the same tenant, hygiene, real-student, point-in-time, soft-delete, descriptor-resolution, replay, boundary, and policy rules the API applies.

Launch gate. The same student-moments, attendance-week, or discipline-review question must converge three ways: API-only, raw-DB-plus-dictionary-only, and free-choice. If a skill pack or app has to carry its own dedupe, kind map, descriptor table, soft-delete filter, roster as-of logic, or event/result boundary logic, the surface leaked.
01

Raw TimeBack source-event import

Migrate production TimeBack learning-event rows without asking the caller to compute Caliper event tuples, Alpha event kind, Content joins, People & Orgs joins, dedupe hashes, or Results-owned metrics.

Trace
EAITD-005, EAITD-006, EAITD-007, EAITD-008, EAITD-108
Dictionary
Run The Student Moments Query

API path

curl -sS -X POST "$EVENTS_BASE_URL/source-imports" \
  -H "Authorization: Bearer $TIMEBACK_JWT" \
  -H "X-Timeback-Tenant: $TENANT_ID" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: duke-2025-26-events-source-import-a1" \
  -d '{
    "sourceSystem": "timeback_production",
    "adapter": "timeback_learning_event_v1",
    "importId": "duke-2025-26-events-a1",
    "records": [
      {
        "id": "pf_918271",
        "student_sourced_id": "b6fa7128-f641-4efd-9075-375411fd6c39",
        "activity_id": "fractions_video_482",
        "activity_kind": "video_scrub",
        "occurred_at": "2026-02-12T15:04:03Z",
        "course_ref": "math-5-fractions"
      }
    ]
  }'

Raw DB path

-- Success is checked at public Events grain, not source-row submission grain.
-- The source import itself is a surface call; raw DB checks only prove materialization.
SELECT
  count(*) AS materialized_event_count,
  min(e.happened_at) AS first_event_at,
  max(e.happened_at) AS last_event_at
FROM alpha.event_view e
WHERE e.tenant_id = :tenant_id
  AND e.student_id = :student_id
  AND e.received_at >= :import_started_at
  AND e.kind IN ('app_opened','content_viewed','video_started','video_scrubbed',
                 'hint_requested','question_answered','assessment_started',
                 'assessment_submitted','lesson_finished','search_run',
                 'feedback_viewed','session_joined');
  • The source record in the example is intentionally TimeBack-shaped. It is not a Caliper event and not an Alpha event object.
  • The server must derive sourceEventId, eventType, profile, action, kind, actorRef, objectRef, studentId, contentId, orgId, happenedAt, and relationship links before writing.
  • events:validation_failed returns HTTP 400. events:adapter_rejected returns HTTP 422. A validation or adapter rejection under HTTP 200 is a raw-ingest failure.
  • On success, acceptedCount equals materializedCount and the returned event ids are immediately readable through GET /events.
02

Last 7 days of moments for one student

List event moments for a given studentId in the last 7 days, joined to People & Orgs for the org as of event.happenedAt and Content through event.contentId for the lesson touched.

Trace
EAITD-003, EAITD-006, EAITD-009, EAITD-103
Dictionary
Run The Student Moments Query

API path

curl "$EVENTS_BASE_URL/events?studentId=person_ada_lovelace&happenedAtFrom=2026-05-28T00:00:00Z&happenedAtTo=2026-06-04T00:00:00Z&pageSize=50" \
  -H "Authorization: Bearer $TIMEBACK_JWT" \
  -H "X-Timeback-Tenant: $TENANT_ID"

Raw DB path

SELECT
  e.id,
  e.happened_at,
  e.kind,
  e.student_id,
  p.first_name,
  p.last_name,
  pm.place_id AS org_id_as_of_event,
  pl.name AS org_name_as_of_event,
  ci.content_id,
  ci.title AS content_title,
  ci.content_kind
FROM alpha.event_view e
-- People & Orgs temporal join: event.happened_at is the only as-of key.
JOIN alpha.person p
  ON p.tenant_id = e.tenant_id
 AND p.person_id = e.student_id
JOIN alpha.place_membership pm
  ON pm.tenant_id = e.tenant_id
 AND pm.person_id = e.student_id
 AND pm.role_kind = 'student'
 AND pm.is_time_locatable = true
 AND pm.begin_date <= e.happened_at::date
 AND (pm.end_date IS NULL OR pm.end_date >= e.happened_at::date)
JOIN alpha.place pl
  ON pl.tenant_id = pm.tenant_id
 AND pl.place_id = pm.place_id
-- Content join: event.content_id is the only public Content relationship key.
LEFT JOIN alpha.content_item_view ci
  ON ci.workspace_id = e.tenant_id
 AND ci.content_id = e.content_id
WHERE e.tenant_id = :tenant_id
  AND e.student_id = :student_id
  AND e.happened_at >= :as_of::timestamptz - interval '7 days'
  AND e.happened_at < :as_of::timestamptz
ORDER BY e.happened_at DESC
LIMIT :page_size;
  • Raw readers use alpha.event_view at public event grain, not caliper.envelope or raw payload rows.
  • The People & Orgs join is point-in-time and formal: begin_date NULL rows are excluded, end_date NULL rows are active after begin_date, and event.happenedAt / e.happened_at is the as-of key.
  • Content has exactly one public Events join key: event.contentId / e.content_id to alpha.content_item_view.content_id. objectRef and targetRef are provenance only.
  • Scores, mastery, MAP, working grade, and report-card fields are intentionally absent. Join Results separately only when the job is a settled outcome report.
03

Migration skeleton for the public event view

Create the raw-DB surface the query above depends on without copying Caliper fields into an Alpha table.

Trace
EAITD-001, EAITD-002, EAITD-006, EAITD-007, EAITD-008
Dictionary
Run The Student Moments Query

API path

Core event writes route through POST /events; rename/cut/restrict fields are persisted in Caliper base tables, not Alpha copies.

Raw DB path

CREATE VIEW alpha.event_view AS
SELECT
  e.tenant_id,
  e.event_row_id AS id,
  e.event_iri AS source_event_id,
  e.event_type,
  e.profile,
  e.action,
  x.event_kind AS kind,
  e.actor AS actor_ref,
  x.student_sourced_id AS student_id,
  e.object AS object_ref,
  x.content_id,
  env.sensor_id AS activity_source_id,
  e.group_entity AS group_ref,
  x.org_sourced_id AS org_id,
  e.generated AS generated_ref,
  e.target AS target_ref,
  e.referrer AS referrer_ref,
  e.federated_session AS session_ref,
  e.event_time AS happened_at,
  env.received_at,
  e.event_extensions AS extensions
FROM caliper.event e
JOIN caliper.envelope env
  ON env.tenant_id = e.tenant_id
 AND env.envelope_id = e.envelope_id
LEFT JOIN alpha.event_extension x
  ON x.tenant_id = e.tenant_id
 AND x.event_row_id = e.event_row_id
WHERE env.envelope_status = 'processed';
  • This is a view, not an Alpha table. It may expose Caliper-sourced columns because it stores nothing.
  • alpha.event_extension is the only Events-owned sidecar here; it stores new Alpha columns such as event_kind, student_sourced_id, content_id, and org_sourced_id plus FKs to base rows.
  • Do not add raw_event, canonical_event, event_hash, raw_envelope, credential_ref, score, mastery, or content-effectiveness columns to this public view.
04

Attendance events for one student and school week

List attendance moments for one student in the last 7 days, joined to People & Orgs as of eventDate.

Trace
EAITD-014, EAITD-016, EAITD-103
Dictionary
Run The Student Moments Query

API path

curl "$EVENTS_BASE_URL/attendance-events?studentId=person_ada_lovelace&from=2026-05-28&to=2026-06-04&pageSize=50" \
  -H "Authorization: Bearer $TIMEBACK_JWT" \
  -H "X-Timeback-Tenant: $TENANT_ID"

Raw DB path

SELECT
  ae.id,
  ae.event_date,
  ae.category,
  ae.duration_minutes,
  ae.student_id,
  p.first_name,
  p.last_name,
  pm.place_id AS school_id_as_of_event,
  pl.name AS school_name_as_of_event
FROM alpha.attendance_event_view ae
JOIN alpha.person p
  ON p.tenant_id = ae.tenant_id
 AND p.person_id = ae.student_id
JOIN alpha.place_membership pm
  ON pm.tenant_id = ae.tenant_id
 AND pm.person_id = ae.student_id
 AND pm.role_kind = 'student'
 AND pm.is_time_locatable = true
 AND pm.begin_date <= ae.event_date
 AND (pm.end_date IS NULL OR pm.end_date >= ae.event_date)
JOIN alpha.place pl
  ON pl.tenant_id = pm.tenant_id
 AND pl.place_id = pm.place_id
WHERE ae.tenant_id = :tenant_id
  AND ae.student_id = :student_id
  AND ae.event_date >= :as_of::date - interval '7 days'
  AND ae.event_date < :as_of::date
  AND ae.is_deleted = false
ORDER BY ae.event_date DESC, ae.id DESC
LIMIT :page_size;
  • Use alpha.attendance_event_view at canonical attendance-event grain, not edfi.edfi_draft_record or raw payload_json alone.
  • Descriptor-valued category must already be resolved through edfi.edfi_descriptor_code; a raw query should not carry its own attendance category table.
  • The point-in-time join uses event_date, not current enrollment and not edfi.canonical_record.updated_at.
05

Discipline events for one student

List discipline moments for one student, with governed behavior/location values and redacted description handling.

Trace
EAITD-015, EAITD-016, EAITD-103, EAITD-111
Dictionary
Run The Student Moments Query

API path

curl "$EVENTS_BASE_URL/discipline-events?studentId=person_ada_lovelace&from=2026-05-01&to=2026-06-04&pageSize=50" \
  -H "Authorization: Bearer $TIMEBACK_JWT" \
  -H "X-Timeback-Tenant: $TENANT_ID"

Raw DB path

SELECT
  de.id,
  de.incident_id,
  de.incident_date,
  de.incident_time,
  de.behavior,
  de.location,
  de.participation_code,
  de.student_id,
  p.first_name,
  p.last_name,
  pm.place_id AS school_id_as_of_incident
FROM alpha.discipline_event_view de
LEFT JOIN alpha.person p
  ON p.tenant_id = de.tenant_id
 AND p.person_id = de.student_id
LEFT JOIN alpha.place_membership pm
  ON pm.tenant_id = de.tenant_id
 AND pm.person_id = de.student_id
 AND pm.role_kind = 'student'
 AND pm.is_time_locatable = true
 AND pm.begin_date <= de.incident_date
 AND (pm.end_date IS NULL OR pm.end_date >= de.incident_date)
WHERE de.tenant_id = :tenant_id
  AND de.student_id = :student_id
  AND de.incident_date >= :from_date
  AND de.incident_date < :to_date
  AND de.is_deleted = false
ORDER BY de.incident_date DESC, de.id DESC
LIMIT :page_size;
  • Discipline description is sensitive and redacted by authorization policy; do not place real narrative text in public examples or logs.
  • Behavior, participationCode, and location are descriptor-resolved governed values. Do not parse them out of description.
  • Discipline actions, sanctions, transcript effects, and durable outcomes are not Events-owned fields.
06

Migration skeleton for attendance and discipline views

Create the Ed-Fi-backed raw-DB views without copying Ed-Fi canonical records into Alpha tables.

Trace
EAITD-012, EAITD-014, EAITD-015, EAITD-016
Dictionary
Run The Student Moments Query

API path

Normal app writes route to the Ed-Fi 1EdTech base surface; production migration can call POST /source-imports with horizons_attendance_event_v1 or horizons_discipline_event_v1 and must get public view rows afterward.

Raw DB path

CREATE VIEW alpha.attendance_event_view AS
SELECT
  c.tenant_id,
  c.edfi_local_id AS id,
  c.record_kind AS source_record_kind,
  c.student_sourced_id AS student_id,
  c.school_sourced_id AS school_id,
  c.class_sourced_id AS class_id,
  (c.payload_json #>> '{AttendanceEvent,EventDate}')::date AS event_date,
  dc.code_value AS category,
  (c.payload_json #>> '{ArrivalTime}')::time AS arrived_at,
  (c.payload_json #>> '{DepartureTime}')::time AS departed_at,
  COALESCE((c.payload_json #>> '{SchoolAttendanceDuration}')::integer,
           (c.payload_json #>> '{SectionAttendanceDuration}')::integer) AS duration_minutes,
  c.updated_at,
  c.is_deleted
FROM edfi.canonical_record c
JOIN edfi.edfi_descriptor_code dc
  ON dc.tenant_id = c.tenant_id
 AND dc.descriptor_type = 'AttendanceEventCategory'
 AND dc.code_value = c.payload_json #>> '{AttendanceEvent,AttendanceEventCategoryDescriptor}'
WHERE c.record_kind IN ('StudentSchoolAttendanceEvent', 'StudentSectionAttendanceEvent');

CREATE VIEW alpha.discipline_event_view AS
SELECT
  c.tenant_id,
  c.edfi_local_id AS id,
  c.source_key_json #>> '{IncidentIdentifier}' AS incident_id,
  c.student_sourced_id AS student_id,
  c.school_sourced_id AS school_id,
  (c.payload_json #>> '{IncidentDate}')::date AS incident_date,
  (c.payload_json #>> '{IncidentTime}')::time AS incident_time,
  behavior.code_value AS behavior,
  participation.code_value AS participation_code,
  location.code_value AS location,
  c.payload_json #>> '{IncidentDescription}' AS description,
  c.updated_at,
  c.is_deleted
FROM edfi.canonical_record c
LEFT JOIN edfi.edfi_descriptor_code behavior
  ON behavior.tenant_id = c.tenant_id
 AND behavior.descriptor_type = 'Behavior'
 AND behavior.code_value = c.payload_json #>> '{BehaviorDescriptor}'
LEFT JOIN edfi.edfi_descriptor_code participation
  ON participation.tenant_id = c.tenant_id
 AND participation.descriptor_type = 'DisciplineIncidentParticipationCode'
 AND participation.code_value = c.payload_json #>> '{DisciplineIncidentParticipationCodes,0}'
LEFT JOIN edfi.edfi_descriptor_code location
  ON location.tenant_id = c.tenant_id
 AND location.descriptor_type = 'IncidentLocation'
 AND location.code_value = c.payload_json #>> '{IncidentLocationDescriptor}'
WHERE c.record_kind IN ('DisciplineIncident', 'StudentDisciplineIncidentBehaviorAssociation');
  • These are views over Ed-Fi canonical storage. There is no CREATE TABLE alpha.attendance_event or CREATE TABLE alpha.discipline_event carrying Ed-Fi-sourced columns.
  • Descriptor joins are illustrative of the required raw-path rule; production SQL may normalize descriptor references differently as long as it uses edfi.edfi_descriptor_code.
  • Ordinary public reads add is_deleted = false and role/scope filters on top of these views.

Convergence guardrails

GuardrailAPI path ruleRaw DB ruleFailure if skippedTrace
tenant_scopeEvery Events API request must carry a tenant in X-Timeback-Tenant that matches the JWT tenant claim.Every raw query must filter caliper.* base rows and alpha.event_extension by the same tenant_id before joining, paging, or counting.A raw query that omits tenant_id can mix demo, reviewer, and real tenant activity into one answer.EAITD-109
hygiene_filterGET /events returns only accepted, processed, redacted event projections; rejected envelopes, duplicate-only evidence, raw payloads, canonical hashes, and conformance internals are not public Alpha rows.Raw-path readers use alpha.event_view or reproduce its WHERE clauses: accepted event rows joined to processed envelope evidence, excluding cut raw/canonical fields and internal conformance rows.Counting raw caliper.envelope or caliper.event rows directly can include invalid submissions, duplicate evidence, or private transport JSON.EAITD-005, EAITD-008, EAITD-010, EAITD-110
real_student_scopestudentId filters return events only for student links the caller is authorized to see and that resolve through People & Orgs as real student records at the event time.Join event.studentId through People & Orgs using happenedAt as the as-of date, keep only real-student rows in TimeBack schools, and exclude non-time-locatable memberships from point-in-time claims.A raw query that trusts actorRef strings or unresolved external ids can include test users, staff actors, or students outside the caller scope.EAITD-006, EAITD-106
point_in_time_join_grainEvents resolves studentId, orgId, contentId, and activitySourceId once through typed relationships; roster and org answers are as of event.happenedAt.Use event.happenedAt for People & Orgs effective-dated joins. begin_date NULL means the relationship is not time-locatable and cannot be counted as a point-in-time match; end_date NULL means active for dates on or after begin_date.Joining to current roster or parsing groupRef can move historical activity into the wrong school, class, brand, modality, or guide assignment.EAITD-006, EAITD-009
duplicate_and_replay_grainPOST /events deduplicates exact replays through sourceEventId, canonical hashes, and Idempotency-Key behavior; GET /events exposes one accepted public event per platform event id.Do not count envelopes as moments. Use the public event id/event view grain, and treat duplicate/replayed envelope evidence as ingest evidence rather than extra student activity.Counting by envelope or raw payload inflates activity when a sender retries the same batch.EAITD-005, EAITD-101, EAITD-105
event_not_result_boundaryEvents may reference a generated result but never returns score, mastery, working grade, MAP, report-card, or content-effectiveness fields.Raw readers must not join from event.generatedRef into Results and then present those fields as Events-owned columns; settled outcomes live in Results and derived content effectiveness lives in Content.A raw query that folds Results into Events gives the same moment two incompatible homes and breaks module-placement QC.EAITD-003
policy_config_inputsevent.kind, page-size bounds, polling limits, and minute-bucket policy come from alpha.policy.events.* and are not client constants.Raw readers use the current alpha.policy.events.* values when interpreting kind, cursor windows, page bounds, or minute buckets; they do not ship a local kind map or hard-coded thresholds.A dashboard or skill pack with its own map/window table can disagree with the API after a policy change.EAITD-007, EAITD-009, EAITD-103, EAITD-107
edfi_descriptor_resolutionGET /attendance-events category and GET /discipline-events behavior/location/participationCode return governed descriptor codes resolved by the Ed-Fi base surface.Raw readers join descriptor-valued payload fields through edfi.edfi_descriptor_code by descriptor_type, namespace, code_value, tenant scope, and effective-date window; they never carry a local descriptor table or accept free text.A raw query that reads descriptor strings directly from payload_json can count obsolete local codes, miss tenant-local governed codes, or disagree with the API after a descriptor registry change.EAITD-014, EAITD-015, EAITD-016
edfi_canonical_onlyAttendance and discipline reads expose only canonical Ed-Fi records, never drafts or pre-ack recovery rows.Raw readers use alpha.attendance_event_view and alpha.discipline_event_view over edfi.canonical_record and exclude edfi.edfi_draft_record unless the job is explicitly draft recovery on the Ed-Fi base surface.Including draft rows turns UI recovery state into real student moments and breaks the Ed-Fi GAP-A5 canonical-state boundary.EAITD-013, EAITD-014, EAITD-015, EAITD-016
edfi_soft_delete_filterOrdinary attendance and discipline list/detail reads exclude soft-deleted Ed-Fi canonical records.Raw readers filter is_deleted = false unless an authorized audit query explicitly asks for deleted records and reports them as correction history, not current moments.A raw query that omits is_deleted can show invalidated attendance or discipline corrections as live events.EAITD-016
edfi_point_in_time_join_grainAttendance and discipline school/student context is resolved through People & Orgs as of eventDate or incidentDate.Use attendanceEvent.eventDate or disciplineEvent.incidentDate as the as-of date for People & Orgs joins. begin_date NULL rows are excluded; end_date NULL rows are active on or after begin_date.Joining to current roster can move historical attendance or discipline rows to the wrong school, class, level, brand, modality, or guide assignment.EAITD-014, EAITD-015, EAITD-016
source_ingest_materializationPOST /source-imports accepts source-shaped TimeBack or Horizons rows, normalizes them server-side, and returns 200 only after accepted rows are readable through the public Events Alpha endpoints.A successful TimeBack import creates processed caliper.envelope/caliper.event rows plus alpha.event_extension relationship keys visible in alpha.event_view. A successful Horizons attendance/discipline import creates canonical Ed-Fi rows visible in alpha.attendance_event_view or alpha.discipline_event_view. Count public view rows, not submitted source rows.HTTP 200 with a Problem body, accepted source rows with zero public rows, or a caller pre-normalizing event kinds/descriptors is a skill leak and fails the migration gate.EAITD-005, EAITD-007, EAITD-012, EAITD-014, EAITD-015, EAITD-108
source_ingest_problem_statusThe ingest adapter returns events:validation_failed with HTTP 400 for invalid request shape and events:adapter_rejected with HTTP 422 for valid source rows the named adapter cannot map. It never returns HTTP 200 for a validation or adapter rejection.Raw-path migration checks treat only committed rows in alpha.event_view / alpha.attendance_event_view / alpha.discipline_event_view as migrated. Problem rows, rejected source rows, and dry-run previews are not counted as materialized Events.A lying 200 hides a failed import from migration reconciliation and produces the exact bad state found by the live gate: source rows > 0 and Events surface rows = 0.EAITD-005, EAITD-008, EAITD-108
API Reference

Endpoint contracts

Every endpoint card keeps request fields, response fields, examples, status codes, and trace links in one place. This is the implementation spec for the next deliverable.

POST /dev/mint?tenantId=demo

Mint a demo token

Mint a short-lived token for the public demo tenant on the shared implementation deploy. Real tenant tokens are operator-minted outside the public API.

Demo helper
Base URL
$EVENTS_BASE_URL = https://platform3-andymontgomery-9773s-projects.vercel.app/events/alpha/implementation/api
Status codes
200 400 403
Trace
PITD-005-AUTH-TENANT-SCOPE, PITD-006-HTTP-ENVELOPE-AND-ERRORS

Request

FieldLocationTypeRequiredMeaningTrace
tenantIdQuerytextRequiredMust be exactly demo for the public helper.PITD-005-AUTH-TENANT-SCOPE

Response

FieldTypeRequiredMeaningTrace
tokenstringRequiredJWT scoped to tenantId=demo.PITD-005-AUTH-TENANT-SCOPE
tenantIdtextRequiredThe tenant the token can access.PITD-005-AUTH-TENANT-SCOPE
expiresAttimestamptzRequiredWhen the token stops working.PITD-005-AUTH-TENANT-SCOPE

cURL

curl -X POST "https://platform3-andymontgomery-9773s-projects.vercel.app/events/alpha/implementation/api/dev/mint?tenantId=demo"

Response body

{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.demo",
  "tenantId": "demo",
  "expiresAt": "2026-06-03T21:00:00.000Z"
}
POST /events

Create events

Create one batch containing one or more plain Alpha event objects. The implementation persists through the approved Caliper envelope and event tables.

Events write
Base URL
$EVENTS_BASE_URL = https://platform3-andymontgomery-9773s-projects.vercel.app/events/alpha/implementation/api
Status codes
202 400 401 403 409 412 415 422 500
Trace
EAITD-005, EAITD-006, EAITD-007, EAITD-101, EAITD-105, EAITD-108

Request

FieldLocationTypeRequiredMeaningTrace
AuthorizationHeaderBearer JWTRequiredSigned platform token. The tenant claim must match X-Timeback-Tenant.EAITD-106, PITD-005-AUTH-TENANT-SCOPE
X-Timeback-TenantHeadertextRequiredTenant boundary. The implementation must reject payload-inferred tenants.EAITD-109, PITD-028-API-AXIS-TENANT-ROUTING
Idempotency-KeyHeaderstringOptionalSafe retry key. Same key plus same request returns the original outcome; same key plus different content returns 409.EAITD-105, PITD-007-IDEMPOTENCY-AND-CONCURRENCY
eventsBodyarray<object>RequiredOne or more plain Alpha event objects.event, EAITD-101
events[].sourceEventIdBodytextOptionalStable source id. If omitted, the platform generates a Caliper event IRI.event.sourceEventId
events[].kindBodyalpha_event_kindRequiredPlain governed event kind. The platform validates this against typed Caliper eventType/profile/action mapping.event.kind, alpha_event_kind
events[].eventTypeBodycaliper_event_typeRequiredCaliper event subclass kept for provenance and mapping.event.eventType, caliper_event_type
events[].profileBodycaliper_profileRequiredCaliper profile kept for provenance and mapping.event.profile, caliper_profile
events[].actionBodycaliper_actionRequiredTyped Caliper action. Do not send prose or display labels.event.action, caliper_action
events[].actorRefBodyobjectRequiredOriginal Caliper actor reference or redacted actor object.event.actorRef
events[].studentIdBodytextOptionalReal People & Orgs relationship when the actor resolves to a student as of happenedAt.event.studentId, EAITD-006
events[].objectRefBodyobjectRequiredOriginal Caliper object reference or redacted object.event.objectRef
events[].contentIdBodytextOptionalReal Content relationship when object or target resolves to a content item.event.contentId, EAITD-006
events[].appRefBodyobjectOptionalCaliper app reference named inside the event, distinct from the registered activity source that delivered the batch.event.appRef, EAITD-006
events[].activitySourceIdBodyuuidOptionalRegistered source that delivered the event.event.activitySourceId, activitySource.id
events[].groupRefBodyobjectOptionalOriginal Caliper group, cohort, class, or organization context.event.groupRef, EAITD-006
events[].orgIdBodytextOptionalResolved People & Orgs organization id when group context maps to a real org as of happenedAt.event.orgId, EAITD-006
events[].generatedRefBodyobjectOptionalGenerated Caliper entity reference such as a response, attempt, or Results-owned result reference. It is a link, not an Events score.event.generatedRef, EAITD-003
events[].targetRefBodyobjectOptionalTarget entity for navigation, launch, move, or media actions.event.targetRef, EAITD-002
events[].referrerRefBodyobjectOptionalReferring resource for navigation or reading activity.event.referrerRef, EAITD-002
events[].sessionRefBodyobjectOptionalSession correlation reference across tools.event.sessionRef, EAITD-002
events[].happenedAtBodytimestamptzRequiredWhen the activity happened. Point-in-time roster and org lookups use this timestamp.event.happenedAt
events[].extensionsBodyobjectOptionalGoverned, non-secret extension values only.event.extensions, EAITD-010

Response

FieldTypeRequiredMeaningTrace
batcheventBatchRequiredSafe receipt and processing summary; raw envelope is not returned.eventBatch, eventBatch.status
dataarray<event>RequiredAccepted event projections visible to the caller.event
warningsarray<object>OptionalSafe non-blocking warnings. Must not contain raw payload or PII.EAITD-010, EAITD-108

cURL

export RUN_ID="$(node -e 'console.log(require("node:crypto").randomUUID())')"
export HAPPENED_AT="$(node -e 'console.log(new Date().toISOString())')"

cat > events.json <<JSON
{
  "events": [
    {
      "sourceEventId": "urn:uuid:$RUN_ID",
      "kind": "question_answered",
      "eventType": "AssessmentItemEvent",
      "profile": "AssessmentProfile",
      "action": "Completed",
      "actorRef": {
        "id": "https://timeback.example.edu/users/student-1",
        "type": "Person"
      },
      "studentId": "student-ada-001",
      "objectRef": {
        "id": "https://timeback.example.edu/items/fractions-1",
        "type": "AssessmentItem",
        "name": "Fractions check"
      },
      "contentId": "content-fractions-video-01",
      "activitySourceId": "2fb3d3d9-a9f0-49ac-9ef7-5d2d1d0b1001",
      "happenedAt": "$HAPPENED_AT",
      "extensions": {
        "https://timeback.example.edu/extensions/outcomeScore": 1
      }
    }
  ]
}
JSON

curl -X POST "$EVENTS_BASE_URL/events" \
  -H "Authorization: Bearer $EVENTS_TOKEN" \
  -H "X-Timeback-Tenant: demo" \
  -H "Idempotency-Key: events-demo-$RUN_ID" \
  -H "Content-Type: application/json" \
  -d @events.json

Request body

{
  "events": [
    {
      "sourceEventId": "urn:uuid:$RUN_ID",
      "kind": "question_answered",
      "eventType": "AssessmentItemEvent",
      "profile": "AssessmentProfile",
      "action": "Completed",
      "actorRef": {
        "id": "https://timeback.example.edu/users/student-1",
        "type": "Person"
      },
      "studentId": "student-ada-001",
      "objectRef": {
        "id": "https://timeback.example.edu/items/fractions-1",
        "type": "AssessmentItem",
        "name": "Fractions check"
      },
      "contentId": "content-fractions-video-01",
      "activitySourceId": "2fb3d3d9-a9f0-49ac-9ef7-5d2d1d0b1001",
      "happenedAt": "$HAPPENED_AT",
      "extensions": {
        "https://timeback.example.edu/extensions/outcomeScore": 1
      }
    }
  ]
}

Example response

{
  "batch": {
    "sentAt": "2026-05-24T13:21:00.000Z",
    "receivedAt": "2026-05-24T13:21:02.125Z",
    "status": "processed"
  },
  "data": [
    {
      "id": "b9f6dd89-b024-4d1d-a0c5-c923aab41001",
      "sourceEventId": "urn:uuid:$RUN_ID",
      "kind": "question_answered",
      "eventType": "AssessmentItemEvent",
      "profile": "AssessmentProfile",
      "action": "Completed",
      "studentId": "student-ada-001",
      "contentId": "content-fractions-video-01",
      "orgId": "org-school-west-001",
      "activitySourceId": "2fb3d3d9-a9f0-49ac-9ef7-5d2d1d0b1001",
      "actorRef": {
        "id": "https://timeback.example.edu/users/student-1",
        "type": "Person"
      },
      "objectRef": {
        "id": "https://timeback.example.edu/items/fractions-1",
        "type": "AssessmentItem",
        "name": "Fractions check"
      },
      "happenedAt": "$HAPPENED_AT",
      "receivedAt": "2026-05-24T13:21:02.125Z",
      "extensions": {
        "https://timeback.example.edu/extensions/outcomeScore": 1
      }
    }
  ]
}
POST /source-imports

Import source-shaped production rows

Accept raw TimeBack Production or Horizons SIS event-shaped rows and normalize them server-side before materializing public Events Alpha rows. This endpoint exists so migration and skill packs do not carry platform logic.

Migration ingest
Base URL
$EVENTS_BASE_URL = https://platform3-andymontgomery-9773s-projects.vercel.app/events/alpha/implementation/api
Status codes
200 400 401 403 409 415 422 500
Trace
EAITD-005, EAITD-007, EAITD-008, EAITD-012, EAITD-014, EAITD-015, EAITD-108

Request

FieldLocationTypeRequiredMeaningTrace
AuthorizationHeaderBearer JWTRequiredSigned platform token. The tenant claim must match X-Timeback-Tenant.EAITD-106, PITD-005-AUTH-TENANT-SCOPE
X-Timeback-TenantHeadertextRequiredTenant boundary. The implementation must reject payload-inferred tenants.EAITD-109, PITD-028-API-AXIS-TENANT-ROUTING
Idempotency-KeyHeaderstringStrongly recommendedRetry identity for the import. Reusing the same key with different records or adapter parameters returns 409.EAITD-105, EAITD-108, PITD-007-IDEMPOTENCY-AND-CONCURRENCY
sourceSystemBodyenumRequiredThe production system that produced the raw records. Allowed: timeback_production, horizons_sis. Invalid when: Missing, free text, names a test fixture, or names nwea_map / assessment score data that belongs in Results.EAITD-005, EAITD-007, EAITD-008, EAITD-108
adapterBodyenumRequiredThe named server-side adapter to run for every record in this import. Allowed: timeback_learning_event_v1, horizons_attendance_event_v1, horizons_discipline_event_v1. Invalid when: Missing, not supported for the sourceSystem, or asks Events to ingest Results-owned scores or MAP rows.EAITD-005, EAITD-007, EAITD-008, EAITD-108
importIdBodytextOptionalCaller-supplied idempotency label for the migration run, used only as import evidence and retry correlation. Allowed: Stable string, 1-120 characters.. Invalid when: Used to route tenant scope, contains PII beyond source-run identity, or changes meaning across retries.EAITD-005, EAITD-007, EAITD-008, EAITD-108
recordsBodyarray<object>RequiredRaw production rows exactly as TimeBack Production or Horizons SIS returns them. Allowed: 1..1000 source-shaped records per request.. Invalid when: Empty, over batch limit, already rewritten into Alpha event objects, or contains secrets/tokens.EAITD-005, EAITD-007, EAITD-008, EAITD-108
dryRunBodybooleanOptionalValidate and preview adapter decisions without writing rows. Allowed: true or false; default false.. Invalid when: The caller treats dryRun=true as migrated data or uses dryRun=false with no readable rows.EAITD-005, EAITD-007, EAITD-008, EAITD-108

Response

FieldTypeRequiredMeaningTrace
data.importIdstringRequiredImport correlation id returned for retries, logs, and materialization checks.EAITD-108
data.sourceSystemenumRequiredThe accepted source system, such as timeback_production or horizons_sis.EAITD-012
data.adapterenumRequiredThe named adapter that normalized the source-shaped rows server-side.EAITD-012
data.acceptedCountintegerRequiredRows accepted by the adapter. For non-dry-run success, this must equal materializedCount.EAITD-108
data.rejectedCountintegerRequiredRows rejected by the adapter. A nonzero value makes the import response a Problem, not a quiet success.EAITD-108
data.materializedCountintegerRequiredRows committed and immediately readable through public Events Alpha endpoints.EAITD-108
data.readablearray<object>RequiredRead links proving accepted rows are visible through /events, /attendance-events, or /discipline-events.EAITD-008, EAITD-108

cURL

curl -sS -X POST "$EVENTS_BASE_URL/source-imports" \
  -H "Authorization: Bearer $EVENTS_TOKEN" \
  -H "X-Timeback-Tenant: demo" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: duke-2025-26-events-source-import-a1" \
  -d '{
  "sourceSystem": "timeback_production",
  "adapter": "timeback_learning_event_v1",
  "importId": "duke-2025-26-events-a1",
  "records": [
    {
      "id": "pf_918271",
      "student_sourced_id": "b6fa7128-f641-4efd-9075-375411fd6c39",
      "activity_id": "fractions_video_482",
      "activity_kind": "video_scrub",
      "occurred_at": "2026-02-12T15:04:03Z",
      "course_ref": "math-5-fractions"
    }
  ]
}'

Request body

{
  "sourceSystem": "timeback_production",
  "adapter": "timeback_learning_event_v1",
  "importId": "duke-2025-26-events-a1",
  "records": [
    {
      "id": "pf_918271",
      "student_sourced_id": "b6fa7128-f641-4efd-9075-375411fd6c39",
      "activity_id": "fractions_video_482",
      "activity_kind": "video_scrub",
      "occurred_at": "2026-02-12T15:04:03Z",
      "course_ref": "math-5-fractions"
    }
  ]
}

Example response

{
  "data": {
    "importId": "duke-2025-26-events-a1",
    "sourceSystem": "timeback_production",
    "adapter": "timeback_learning_event_v1",
    "acceptedCount": 1,
    "rejectedCount": 0,
    "materializedCount": 1,
    "dryRun": false,
    "readable": [
      {
        "resource": "events",
        "href": "/events?studentId=b6fa7128-f641-4efd-9075-375411fd6c39&modifiedSince=2026-02-12T15:04:00Z",
        "ids": [
          "b9f6dd89-b024-4d1d-a0c5-c923aab41001"
        ]
      }
    ]
  }
}
GET /events

List events

Read a cursor-paged activity stream with bounded filters. Sort order is happenedAt descending with a stable id tie-breaker.

Activity stream
Base URL
$EVENTS_BASE_URL = https://platform3-andymontgomery-9773s-projects.vercel.app/events/alpha/implementation/api
Status codes
200 400 401 403 422 500
Trace
EAITD-009, EAITD-102, EAITD-103, EAITD-107, EAITD-112

Request

FieldLocationTypeRequiredMeaningTrace
AuthorizationHeaderBearer JWTRequiredSigned platform token. The tenant claim must match X-Timeback-Tenant.EAITD-106, PITD-005-AUTH-TENANT-SCOPE
X-Timeback-TenantHeadertextRequiredTenant boundary. The implementation must reject payload-inferred tenants.EAITD-109, PITD-028-API-AXIS-TENANT-ROUTING
studentIdQuerytextOptionalFilter to learning activity events for one resolved TimeBack student. This is the People & Orgs join key; unresolved actorRef-only events are not returned by this filter. Example: student-ada-001.event.studentId, EAITD-006, EAITD-009
contentIdQuerytextOptionalFilter to events linked to one Content item. This is the only public Content join key; objectRef and targetRef are provenance, not competing Content keys. Example: content-fractions-video-01.event.contentId, EAITD-006, EAITD-009
orgIdQuerytextOptionalFilter to events resolved to one People & Orgs organization as of event.happenedAt. Example: org-school-west-001.event.orgId, EAITD-006, EAITD-009
activitySourceIdQueryuuidOptionalFilter to events delivered by one registered activity source. Example: 2fb3d3d9-a9f0-49ac-9ef7-5d2d1d0b1001.event.activitySourceId, EAITD-004, EAITD-009
kindQueryalpha_event_kindOptionalFilter by the governed plain-language event kind. Example: question_answered.event.kind, alpha_event_kind, EAITD-007, EAITD-009
actionQuerycaliper_actionOptionalAdvanced Caliper provenance filter. Prefer kind unless exact Caliper action matters. Example: Completed.event.action, caliper_action, EAITD-002, EAITD-009
eventTypeQuerycaliper_event_typeOptionalAdvanced Caliper provenance filter. Prefer kind unless exact Caliper subclass matters. Example: AssessmentItemEvent.event.eventType, caliper_event_type, EAITD-002, EAITD-009
happenedAtFromQuerytimestamptzOptionalInclusive lower bound for when the learning activity happened; the same happenedAt value is the as-of timestamp for People & Orgs joins. Example: 2026-05-24T00:00:00.000Z.event.happenedAt, EAITD-009, EAITD-103
happenedAtToQuerytimestamptzOptionalExclusive upper bound for when the learning activity happened; the same happenedAt value is the as-of timestamp for People & Orgs joins. Example: 2026-05-25T00:00:00.000Z.event.happenedAt, EAITD-009, EAITD-103
modifiedSinceQuerytimestamptzOptionalReturn events received after this timestamp for polling. Does not mean the event happened after this time. Example: 2026-06-03T12:00:00.000Z.event.receivedAt, EAITD-009, EAITD-107
cursorQueryopaque stringOptionalStable cursor from the previous page. Clients must not parse it. Example: eyJoYXBwZW5lZEF0IjoiMjAyNi0wNS0yNFQxMzoyMDo0MloiLCJpZCI6ImI5ZjZkZDg5In0=.EAITD-103
pageSizeQueryintegerOptionalBounded page size controlled by surface config; consumers do not hard-code max values. Example: 50.EAITD-103

Response

FieldTypeRequiredMeaningTrace
dataarray<event>RequiredRows visible to the token after tenant, role, scope, hygiene, real-student, replay, boundary, policy, and redaction filters.event, EAITD-010, EAITD-103
nextCursoropaque string|nullRequiredUse as cursor on the next page. Do not parse it.EAITD-103
pageSizeintegerRequiredActual page size applied by alpha.policy.events.page_size.eventsPolicy.pageSize

cURL

curl "$EVENTS_BASE_URL/events?studentId=student-ada-001&kind=question_answered&pageSize=50" \
  -H "Authorization: Bearer $EVENTS_TOKEN" \
  -H "X-Timeback-Tenant: demo"

Response body

{
  "data": [
    {
      "id": "b9f6dd89-b024-4d1d-a0c5-c923aab41001",
      "sourceEventId": "urn:uuid:11111111-1111-4111-8111-111111111111",
      "kind": "question_answered",
      "eventType": "AssessmentItemEvent",
      "profile": "AssessmentProfile",
      "action": "Completed",
      "studentId": "student-ada-001",
      "contentId": "content-fractions-video-01",
      "orgId": "org-school-west-001",
      "activitySourceId": "2fb3d3d9-a9f0-49ac-9ef7-5d2d1d0b1001",
      "actorRef": {
        "id": "https://timeback.example.edu/users/student-1",
        "type": "Person"
      },
      "objectRef": {
        "id": "https://timeback.example.edu/items/fractions-1",
        "type": "AssessmentItem",
        "name": "Fractions check"
      },
      "happenedAt": "2026-05-24T13:20:42.000Z",
      "receivedAt": "2026-05-24T13:21:02.125Z",
      "extensions": {
        "https://timeback.example.edu/extensions/outcomeScore": 1
      }
    }
  ],
  "nextCursor": "eyJoYXBwZW5lZEF0IjoiMjAyNi0wNS0yNFQxMzoyMDo0MloiLCJpZCI6ImI5ZjZkZDg5In0=",
  "pageSize": 50
}
GET /events/{eventId}

Get one event

Read one redacted event detail with embedded eventThing and eventLink projections. Raw event payloads remain cut from public Alpha.

Activity detail
Base URL
$EVENTS_BASE_URL = https://platform3-andymontgomery-9773s-projects.vercel.app/events/alpha/implementation/api
Status codes
200 401 403 404 500
Trace
EAITD-002, EAITD-006, EAITD-008, EAITD-009, EAITD-010

Request

FieldLocationTypeRequiredMeaningTrace
AuthorizationHeaderBearer JWTRequiredSigned platform token. The tenant claim must match X-Timeback-Tenant.EAITD-106, PITD-005-AUTH-TENANT-SCOPE
X-Timeback-TenantHeadertextRequiredTenant boundary. The implementation must reject payload-inferred tenants.EAITD-109, PITD-028-API-AXIS-TENANT-ROUTING
eventIdPathuuidRequiredStable Alpha event id.event.id

Response

FieldTypeRequiredMeaningTrace
dataeventRequiredRedacted event projection.event
data.eventThingsarray<eventThing>RequiredNamed entities embedded for detail reads; no standalone list endpoint.eventThing, EAITD-112
data.eventLinksarray<eventLink>RequiredTyped relationships from this event to each eventThing.eventLink, alpha_event_link_role

cURL

curl "$EVENTS_BASE_URL/events/b9f6dd89-b024-4d1d-a0c5-c923aab41001" \
  -H "Authorization: Bearer $EVENTS_TOKEN" \
  -H "X-Timeback-Tenant: demo"

Response body

{
  "data": {
    "id": "b9f6dd89-b024-4d1d-a0c5-c923aab41001",
    "sourceEventId": "urn:uuid:11111111-1111-4111-8111-111111111111",
    "kind": "question_answered",
    "eventType": "AssessmentItemEvent",
    "profile": "AssessmentProfile",
    "action": "Completed",
    "studentId": "student-ada-001",
    "contentId": "content-fractions-video-01",
    "orgId": "org-school-west-001",
    "activitySourceId": "2fb3d3d9-a9f0-49ac-9ef7-5d2d1d0b1001",
    "actorRef": {
      "id": "https://timeback.example.edu/users/student-1",
      "type": "Person"
    },
    "objectRef": {
      "id": "https://timeback.example.edu/items/fractions-1",
      "type": "AssessmentItem",
      "name": "Fractions check"
    },
    "happenedAt": "2026-05-24T13:20:42.000Z",
    "receivedAt": "2026-05-24T13:21:02.125Z",
    "extensions": {
      "https://timeback.example.edu/extensions/outcomeScore": 1
    },
    "eventThings": [
      {
        "id": "018c8207-7418-47fd-9c1c-3f38a3b41001",
        "sourceId": "https://timeback.example.edu/users/student-1",
        "type": "Person",
        "name": "Ada Learner"
      },
      {
        "id": "018c8207-7418-47fd-9c1c-3f38a3b41002",
        "sourceId": "https://timeback.example.edu/items/fractions-1",
        "type": "AssessmentItem",
        "name": "Fractions check"
      }
    ],
    "eventLinks": [
      {
        "role": "actor",
        "order": 0,
        "rawPath": "actor"
      },
      {
        "role": "object",
        "order": 0,
        "rawPath": "object"
      }
    ]
  }
}
GET /attendance-events

List attendance events

Read a cursor-paged attendance stream with student, school, class, category, date, and modifiedSince filters. Writes remain on the Ed-Fi 1EdTech base surface.

Attendance moments
Base URL
$EVENTS_BASE_URL = https://platform3-andymontgomery-9773s-projects.vercel.app/events/alpha/implementation/api
Status codes
200 400 401 403 422 500
Trace
EAITD-013, EAITD-014, EAITD-016, EAITD-102, EAITD-103, EAITD-112

Request

FieldLocationTypeRequiredMeaningTrace
AuthorizationHeaderBearer JWTRequiredSigned platform token. The tenant claim must match X-Timeback-Tenant.EAITD-106, PITD-005-AUTH-TENANT-SCOPE
X-Timeback-TenantHeadertextRequiredTenant boundary. The implementation must reject payload-inferred tenants.EAITD-109, PITD-028-API-AXIS-TENANT-ROUTING
studentIdQuerytextOptionalFilter to attendance events for one resolved TimeBack student. Example: student-ada-001.attendanceEvent.studentId, EAITD-014, EAITD-103
schoolIdQuerytextOptionalFilter to attendance events for one People & Orgs school. Example: org-school-west-001.attendanceEvent.schoolId, EAITD-014, EAITD-103
classIdQuerytextOptionalFilter to section/class attendance events for one People & Orgs class. Example: class-algebra-1-a.attendanceEvent.classId, EAITD-014, EAITD-103
categoryQueryedfi_attendance_event_categoryOptionalFilter by governed Ed-Fi attendance category descriptor. Example: Present.attendanceEvent.category, edfi_attendance_event_category, EAITD-014, EAITD-016
fromQuerydateOptionalInclusive lower bound for the attendance event date. Example: 2026-05-28.attendanceEvent.eventDate, EAITD-014, EAITD-103
toQuerydateOptionalExclusive upper bound for the attendance event date. Example: 2026-06-04.attendanceEvent.eventDate, EAITD-014, EAITD-103
modifiedSinceQuerytimestamptzOptionalReturn canonical attendance records updated after this timestamp for polling. Example: 2026-06-03T12:00:00.000Z.EAITD-016, EAITD-107
cursorQueryopaque stringOptionalStable cursor from the previous page. Clients must not parse it. Example: eyJoYXBwZW5lZEF0IjoiMjAyNi0wNS0yNFQxMzoyMDo0MloiLCJpZCI6ImI5ZjZkZDg5In0=.EAITD-103
pageSizeQueryintegerOptionalBounded page size controlled by surface config; consumers do not hard-code max values. Example: 50.EAITD-103

Response

FieldTypeRequiredMeaningTrace
dataarray<attendanceEvent>RequiredRows visible to the token after tenant, role, scope, hygiene, real-student, soft-delete, descriptor-resolution, and redaction filters.attendanceEvent, EAITD-010, EAITD-016
nextCursoropaque string|nullRequiredUse as cursor on the next page. Do not parse it.EAITD-103
pageSizeintegerRequiredActual page size applied by alpha.policy.events.page_size.eventsPolicy.pageSize

cURL

export TO_DATE="$(node -e 'console.log(new Date().toISOString().slice(0,10))')"
export FROM_DATE="$(node -e 'const d=new Date(); d.setUTCDate(d.getUTCDate()-7); console.log(d.toISOString().slice(0,10))')"

curl "$EVENTS_BASE_URL/attendance-events?studentId=student-ada-001&from=$FROM_DATE&to=$TO_DATE&pageSize=50" \
  -H "Authorization: Bearer $EVENTS_TOKEN" \
  -H "X-Timeback-Tenant: demo"

Response body

{
  "data": [
    {
      "id": "018f4f57-7f9a-7c49-a768-1d9bbcc88a02",
      "sourceRecordKind": "StudentSchoolAttendanceEvent",
      "studentId": "student-ada-001",
      "schoolId": "org-school-west-001",
      "classId": "class-algebra-1-a",
      "eventDate": "2026-06-03",
      "category": "Present",
      "durationMinutes": 400,
      "isDeleted": false,
      "arrivedAt": "08:25:00",
      "departedAt": "15:05:00"
    }
  ],
  "nextCursor": null,
  "pageSize": 50
}
GET /attendance-events/{attendanceEventId}

Get one attendance event

Read one redacted attendance moment. The object is a view over an Ed-Fi canonical attendance record, not an Events-owned copy.

Attendance detail
Base URL
$EVENTS_BASE_URL = https://platform3-andymontgomery-9773s-projects.vercel.app/events/alpha/implementation/api
Status codes
200 401 403 404 500
Trace
EAITD-014, EAITD-016, EAITD-102

Request

FieldLocationTypeRequiredMeaningTrace
AuthorizationHeaderBearer JWTRequiredSigned platform token. The tenant claim must match X-Timeback-Tenant.EAITD-106, PITD-005-AUTH-TENANT-SCOPE
X-Timeback-TenantHeadertextRequiredTenant boundary. The implementation must reject payload-inferred tenants.EAITD-109, PITD-028-API-AXIS-TENANT-ROUTING
attendanceEventIdPathuuidRequiredStable attendanceEvent.id from the Ed-Fi canonical record overlay.attendanceEvent.id

Response

FieldTypeRequiredMeaningTrace
dataattendanceEventRequiredSingle redacted row visible to the caller.attendanceEvent, EAITD-010

cURL

curl "$EVENTS_BASE_URL/attendance-events/018f4f57-7f9a-7c49-a768-1d9bbcc88a02" \
  -H "Authorization: Bearer $EVENTS_TOKEN" \
  -H "X-Timeback-Tenant: demo"

Response body

{
  "data": {
    "id": "018f4f57-7f9a-7c49-a768-1d9bbcc88a02",
    "sourceRecordKind": "StudentSchoolAttendanceEvent",
    "studentId": "student-ada-001",
    "schoolId": "org-school-west-001",
    "classId": "class-algebra-1-a",
    "eventDate": "2026-06-03",
    "category": "Present",
    "durationMinutes": 400,
    "isDeleted": false,
    "arrivedAt": "08:25:00",
    "departedAt": "15:05:00"
  }
}
GET /discipline-events

List discipline events

Read a cursor-paged discipline stream with student, school, incident, behavior, date, and modifiedSince filters. Sensitive narrative text stays redacted by role and scope.

Discipline moments
Base URL
$EVENTS_BASE_URL = https://platform3-andymontgomery-9773s-projects.vercel.app/events/alpha/implementation/api
Status codes
200 400 401 403 422 500
Trace
EAITD-013, EAITD-015, EAITD-016, EAITD-102, EAITD-103, EAITD-111, EAITD-112

Request

FieldLocationTypeRequiredMeaningTrace
AuthorizationHeaderBearer JWTRequiredSigned platform token. The tenant claim must match X-Timeback-Tenant.EAITD-106, PITD-005-AUTH-TENANT-SCOPE
X-Timeback-TenantHeadertextRequiredTenant boundary. The implementation must reject payload-inferred tenants.EAITD-109, PITD-028-API-AXIS-TENANT-ROUTING
studentIdQuerytextOptionalFilter to discipline events for one resolved TimeBack student. Example: student-ada-001.disciplineEvent.studentId, EAITD-015, EAITD-103
schoolIdQuerytextOptionalFilter to discipline events for one People & Orgs school. Example: org-school-west-001.disciplineEvent.schoolId, EAITD-015, EAITD-103
incidentIdQuerytextOptionalFilter to one locally assigned incident identifier, scoped by tenant and school. Example: INC-2026-0038.disciplineEvent.incidentId, EAITD-015, EAITD-103
behaviorQueryedfi_behaviorOptionalFilter by governed Ed-Fi behavior descriptor. Example: School Violation.disciplineEvent.behavior, edfi_behavior, EAITD-015, EAITD-016
fromQuerydateOptionalInclusive lower bound for the incident date. Example: 2026-05-28.disciplineEvent.incidentDate, EAITD-015, EAITD-103
toQuerydateOptionalExclusive upper bound for the incident date. Example: 2026-06-04.disciplineEvent.incidentDate, EAITD-015, EAITD-103
modifiedSinceQuerytimestamptzOptionalReturn canonical discipline records updated after this timestamp for polling. Example: 2026-06-03T12:00:00.000Z.EAITD-016, EAITD-107
cursorQueryopaque stringOptionalStable cursor from the previous page. Clients must not parse it. Example: eyJoYXBwZW5lZEF0IjoiMjAyNi0wNS0yNFQxMzoyMDo0MloiLCJpZCI6ImI5ZjZkZDg5In0=.EAITD-103
pageSizeQueryintegerOptionalBounded page size controlled by surface config; consumers do not hard-code max values. Example: 50.EAITD-103

Response

FieldTypeRequiredMeaningTrace
dataarray<disciplineEvent>RequiredRows visible to the token after tenant, role, scope, hygiene, real-student, soft-delete, descriptor-resolution, and redaction filters.disciplineEvent, EAITD-010, EAITD-016
nextCursoropaque string|nullRequiredUse as cursor on the next page. Do not parse it.EAITD-103
pageSizeintegerRequiredActual page size applied by alpha.policy.events.page_size.eventsPolicy.pageSize

cURL

export TO_DATE="$(node -e 'console.log(new Date().toISOString().slice(0,10))')"
export FROM_DATE="$(node -e 'const d=new Date(); d.setUTCDate(d.getUTCDate()-30); console.log(d.toISOString().slice(0,10))')"

curl "$EVENTS_BASE_URL/discipline-events?studentId=student-ada-001&from=$FROM_DATE&to=$TO_DATE&pageSize=50" \
  -H "Authorization: Bearer $EVENTS_TOKEN" \
  -H "X-Timeback-Tenant: demo"

Response body

{
  "data": [
    {
      "id": "018f4f57-7f9a-7c49-a768-1d9bbcc88a03",
      "incidentId": "INC-2026-0038",
      "studentId": "student-ada-001",
      "schoolId": "org-school-west-001",
      "incidentDate": "2026-06-02",
      "incidentTime": "10:22:00",
      "behavior": "School Violation",
      "participationCode": "Perpetrator",
      "location": "Classroom",
      "description": "Redacted discipline narrative",
      "isDeleted": false
    }
  ],
  "nextCursor": null,
  "pageSize": 50
}
GET /discipline-events/{disciplineEventId}

Get one discipline event

Read one redacted discipline moment at student-incident-behavior grain. Durable sanctions, transcript effects, and outcomes belong outside Events.

Discipline detail
Base URL
$EVENTS_BASE_URL = https://platform3-andymontgomery-9773s-projects.vercel.app/events/alpha/implementation/api
Status codes
200 401 403 404 500
Trace
EAITD-015, EAITD-016, EAITD-102, EAITD-111

Request

FieldLocationTypeRequiredMeaningTrace
AuthorizationHeaderBearer JWTRequiredSigned platform token. The tenant claim must match X-Timeback-Tenant.EAITD-106, PITD-005-AUTH-TENANT-SCOPE
X-Timeback-TenantHeadertextRequiredTenant boundary. The implementation must reject payload-inferred tenants.EAITD-109, PITD-028-API-AXIS-TENANT-ROUTING
disciplineEventIdPathuuidRequiredStable disciplineEvent.id from the Ed-Fi canonical record overlay.disciplineEvent.id

Response

FieldTypeRequiredMeaningTrace
datadisciplineEventRequiredSingle redacted row visible to the caller.disciplineEvent, EAITD-010

cURL

curl "$EVENTS_BASE_URL/discipline-events/018f4f57-7f9a-7c49-a768-1d9bbcc88a03" \
  -H "Authorization: Bearer $EVENTS_TOKEN" \
  -H "X-Timeback-Tenant: demo"

Response body

{
  "data": {
    "id": "018f4f57-7f9a-7c49-a768-1d9bbcc88a03",
    "incidentId": "INC-2026-0038",
    "studentId": "student-ada-001",
    "schoolId": "org-school-west-001",
    "incidentDate": "2026-06-02",
    "incidentTime": "10:22:00",
    "behavior": "School Violation",
    "participationCode": "Perpetrator",
    "location": "Classroom",
    "description": "Redacted discipline narrative",
    "isDeleted": false
  }
}
GET /activity-sources

List activity sources

Read the safe source registry fields the caller can see. Credential values and internal metadata are never returned.

Source registry
Base URL
$EVENTS_BASE_URL = https://platform3-andymontgomery-9773s-projects.vercel.app/events/alpha/implementation/api
Status codes
200 401 403 500
Trace
EAITD-004, EAITD-010, EAITD-102, EAITD-112

Request

FieldLocationTypeRequiredMeaningTrace
AuthorizationHeaderBearer JWTRequiredSigned platform token. The tenant claim must match X-Timeback-Tenant.EAITD-106, PITD-005-AUTH-TENANT-SCOPE
X-Timeback-TenantHeadertextRequiredTenant boundary. The implementation must reject payload-inferred tenants.EAITD-109, PITD-028-API-AXIS-TENANT-ROUTING
statusQueryalpha_activity_source_statusOptionalFilter by active, paused, or retired.activitySource.status, alpha_activity_source_status

Response

FieldTypeRequiredMeaningTrace
dataarray<activitySource>RequiredSafe source registration rows.activitySource
nextCursoropaque string|nullRequiredCursor when there are more visible sources.EAITD-112

cURL

curl "$EVENTS_BASE_URL/activity-sources?status=active" \
  -H "Authorization: Bearer $EVENTS_TOKEN" \
  -H "X-Timeback-Tenant: demo"

Response body

{
  "data": [
    {
      "id": "2fb3d3d9-a9f0-49ac-9ef7-5d2d1d0b1001",
      "sourceIri": "https://timeback.example.edu/sensors/caliper",
      "name": "TimeBack Caliper Sensor",
      "status": "active",
      "createdAt": "2026-05-24T13:20:00.000Z",
      "updatedAt": "2026-05-24T13:20:00.000Z"
    }
  ],
  "nextCursor": null
}
GET /activity-sources/{sourceId}

Get one activity source

Read safe detail for one source. Secrets stay in the managed credential store and never appear as fields or tags.

Source registry
Base URL
$EVENTS_BASE_URL = https://platform3-andymontgomery-9773s-projects.vercel.app/events/alpha/implementation/api
Status codes
200 401 403 404 500
Trace
EAITD-004, EAITD-010

Request

FieldLocationTypeRequiredMeaningTrace
AuthorizationHeaderBearer JWTRequiredSigned platform token. The tenant claim must match X-Timeback-Tenant.EAITD-106, PITD-005-AUTH-TENANT-SCOPE
X-Timeback-TenantHeadertextRequiredTenant boundary. The implementation must reject payload-inferred tenants.EAITD-109, PITD-028-API-AXIS-TENANT-ROUTING
sourceIdPathuuidRequiredStable activitySource.id.activitySource.id

Response

FieldTypeRequiredMeaningTrace
dataactivitySourceRequiredSafe source detail with no credentialRef, no metadata, and no secret value.activitySource, activitySource.id

cURL

curl "$EVENTS_BASE_URL/activity-sources/2fb3d3d9-a9f0-49ac-9ef7-5d2d1d0b1001" \
  -H "Authorization: Bearer $EVENTS_TOKEN" \
  -H "X-Timeback-Tenant: demo"

Response body

{
  "data": {
    "id": "2fb3d3d9-a9f0-49ac-9ef7-5d2d1d0b1001",
    "sourceIri": "https://timeback.example.edu/sensors/caliper",
    "name": "TimeBack Caliper Sensor",
    "status": "active",
    "createdAt": "2026-05-24T13:20:00.000Z",
    "updatedAt": "2026-05-24T13:20:00.000Z"
  }
}
Behavior

Rules clients must be able to trust

Event is not a result

Events records the moment. Score, mastery, MAP outcome, working grade, report card, and the student's knowledge graph live in Results.

EAITD-003, EAITD-001

Typed kind is surface-owned

event.kind is derived once from typed Caliper eventType, profile, and action plus alpha.policy.events.kind_map. Consumers filter by kind; they do not parse names or URLs.

event.kind, eventsPolicy.kindMap, EAITD-007

Point-in-time lookup happens at happenedAt

Roster and org resolution uses event.happenedAt. If People & Orgs cannot locate the row in time, Events keeps the source reference but does not claim a resolved link.

event.happenedAt, EAITD-006

Secrets and raw payloads are cut

credentialRef, rawEnvelope, rawPayload, canonical JSON, hashes, raw entity browse, and public conformance mutation are not public Alpha fields.

EAITD-004, EAITD-008, EAITD-010

Polling ships; webhooks wait

GET /events supports modifiedSince polling. Outbound webhooks and push streams are deferred until repeated integration evidence shows polling blocks real jobs.

EAITD-107, EAITD-103

Attendance and discipline are Events reads, Ed-Fi writes

attendanceEvent and disciplineEvent are read-only Alpha views over the approved Ed-Fi 1EdTech base. Events documents the moment-shaped read path; Ed-Fi owns canonical writes, descriptors, drafts, and soft-delete state.

EAITD-013, EAITD-014, EAITD-015, EAITD-016

Source-shaped ingest is server-normalized

POST /source-imports accepts TimeBack and Horizons rows in source shape, then the server derives Caliper tuples, Alpha kind, descriptors, relationship keys, dedupe evidence, and public rows. A migration app that computes those fields has found a surface leak.

EAITD-005, EAITD-007, EAITD-008, EAITD-108

Discipline narrative is privacy-sensitive

Discipline descriptions are returned only as safe, authorization-filtered text. Examples, Problem JSON, search indexes, logs, and client retries must not echo raw narratives.

disciplineEvent.description, EAITD-111, EAITD-010

Privacy / Retention

Redacted reads ship; public deletion and Events-local retention wait.

EAITD-111 pins the privacy/retention API axis. Events Alpha returns safe projections for activity dashboards, preserves sensitive raw payloads internally for replay and audit, and deliberately does not expose public Events-specific DELETE or age-based retention endpoints.

TopicCommitmentCustomer impactTrace
Returned event projectionsPublic reads return tenant/role-scoped, redacted event projections. They can include safe ids, typed kind, timestamps, and permitted relationship ids; they must not include raw Caliper payloads, bearer tokens, source credentials, IP addresses, user agents, or direct learner PII in secondary surfaces.A teacher activity panel can show what happened today without becoming a raw data export.EAITD-010, EAITD-111, event.actorRef, event.objectRef
Raw payload preservationRaw Caliper payloads may be preserved internally for replay, audit, and 1EdTech evidence, but rawEnvelope, rawPayload, canonical JSON, and hashes are cut from public Alpha.Support and compliance evidence still exists, while app builders cannot accidentally depend on raw transport internals.EAITD-008, EAITD-010, EAITD-111
Deletion and retentionEvents Alpha does not ship public DELETE or Events-local age-based retention endpoints. Retention policy remains platform-owned until the platform privacy policy names a period or a legal/compliance workflow requires public erasure.Clients should not build a local delete workflow for Events; they should follow platform privacy commitments when those are published.EAITD-101, EAITD-111, PITD-030-API-AXIS-PRIVACY-RETENTION
Problem and search redactionProblem JSON, logs, audit metadata, docs search indexes, and conformance evidence may name safe field paths and codes, but must not echo raw field values that could identify a student, parent, teacher, credential, or private resource.A client can safely show Problem titles/details to an operator without leaking student data.EAITD-010, EAITD-108, EAITD-111
Data Model

Objects exposed to Alpha customers

activitySource

The app or service allowed to send activity into Events.

rename + restrict
Visibility
public list + detail
Source
caliper.sensor
Dictionary
activitySource
Primary key
id
Authority
The upstream caliper.sensor row is storage truth. Alpha exposes only safe source identity and lifecycle fields.
Lifecycle
Created before an app can send events. Active sources can write; paused and retired sources remain for history but cannot create processed events.
FieldTypeMeaningTrace
activitySource.iduuidStable TimeBack identifier for the app or service that sent activity.EAITD-004
activitySource.sourceIritextThe Caliper Sensor IRI kept for provenance and exact 1EdTech traceability.EAITD-004
activitySource.nametextPlain label shown to teachers, support, and app-builder LLMs when identifying which app sent an event.EAITD-004
activitySource.statustextLifecycle gate that decides whether this source can send new events.EAITD-004
activitySource.createdAttimestamptzWhen the activity source registration was created.EAITD-004
activitySource.updatedAttimestamptzWhen the safe registration fields or lifecycle status last changed.EAITD-004

eventBatch

The transport package that carried one or more event moments into the platform.

rename + cut public detail
Visibility
write acknowledgement + internal evidence; no public list/detail
Source
caliper.envelope
Dictionary
eventBatch
Primary key
internal envelope_id, not public Alpha identity
Authority
caliper.envelope remains the evidence record; public Alpha cuts raw transport internals.
Lifecycle
Created on ingest as Caliper envelope evidence. Public Alpha can report safe status in write flows but does not expose raw batch browsing.
FieldTypeMeaningTrace
eventBatch.sentAttimestamptzWhen the sending app says it sent the batch.EAITD-005
eventBatch.receivedAttimestamptzWhen TimeBack received the batch.EAITD-005
eventBatch.statustextProcessing state for the batch that carried one or more events.EAITD-005

event

One immutable moment in the activity stream.

rename + restrict + extend
Visibility
public list + detail, redacted by role and scope
Source
caliper.event plus caliper.envelope and relationship projections
Dictionary
event
Primary key
id
Authority
Raw Caliper event remains upstream evidence. Alpha event is the redacted, school-language projection for customers and LLMs.
Lifecycle
Accepted through POST /events, normalized through Caliper envelope/event storage, then read through cursor-paged list and detail endpoints. No public PUT, PATCH, or DELETE route mutates accepted events.
FieldTypeMeaningTrace
event.iduuidStable TimeBack id for one normalized activity-stream moment.EAITD-002
event.sourceEventIdtextStable id supplied by the source or generated as a Caliper event IRI when Alpha accepts a plain event.EAITD-005
event.eventTypetextCaliper Event subclass kept for provenance and advanced filters.EAITD-002
event.profiletextCaliper profile kept for provenance and kind derivation.EAITD-002
event.actiontextTyped Caliper action describing what the actor did.EAITD-002
event.kindtextPlain, governed event category used by teachers, students, parents, app-builder LLMs, and reports.EAITD-007
event.actorRefjsonbOriginal Caliper actor reference or redacted actor object for the person, app, or organization that acted.EAITD-002
event.studentIdtextPlain TimeBack student id when the actor resolves to a known student.EAITD-006
event.objectRefjsonbOriginal Caliper object reference or redacted object acted on by the actor.EAITD-002
event.contentIdtextThe single Content join key for Events: the Content module id when the object or target resolves to a known article, video, question, test, lesson, or other content item.EAITD-006
event.appRefjsonbApp named inside the event, distinct from the activitySource that delivered the event.EAITD-002
event.activitySourceIduuidRegistered activity source that delivered the event.EAITD-004
event.groupRefjsonbOriginal Caliper group or cohort context.EAITD-002
event.orgIdtextPeople & Orgs organization id when the group context resolves to a known school, class, campus, or org as of happenedAt.EAITD-006
event.generatedRefjsonbGenerated output reference, such as an attempt, response, or Results-owned result reference.EAITD-003
event.targetRefjsonbTarget entity for navigation, launch, move, or media actions.EAITD-002
event.referrerRefjsonbReferring resource for navigation or reading activity.EAITD-002
event.sessionRefjsonbSession correlation reference across tools.EAITD-002
event.happenedAttimestamptzWhen the activity happened and the formal as-of key for People & Orgs joins.EAITD-002
event.receivedAttimestamptzWhen TimeBack received the batch that carried this event.EAITD-005
event.extensionsjsonbGoverned, non-secret, redacted extension values that remain after official Caliper fields are normalized.EAITD-010

attendanceEvent

One attendance moment for a student, read as an Alpha Events object without copying Ed-Fi attendance records.

rename + restrict
Visibility
public list + detail, redacted by role and scope
Source
edfi.canonical_record where record_kind in (StudentSchoolAttendanceEvent, StudentSectionAttendanceEvent)
Dictionary
attendanceEvent
Primary key
id
Authority
The Ed-Fi base surface owns writes, descriptors, soft-delete, draft/canonical state, and roster resolution. Events Alpha owns only the school-language read view and raw/API convergence rules.
Lifecycle
Normal app writes route through the Ed-Fi 1EdTech base surface. Production migration may use POST /source-imports with horizons_attendance_event_v1, which writes canonical Ed-Fi storage server-side and then reads through alpha.attendance_event_view. Events Alpha ships read-only list/detail routes for ordinary attendance reads.
FieldTypeMeaningTrace
attendanceEvent.idUUIDStable platform id for the canonical Ed-Fi attendance record projected as an Alpha moment.EAITD-014
attendanceEvent.sourceRecordKindtext enumWhich approved Ed-Fi attendance resource produced this moment.EAITD-014
attendanceEvent.studentIdTEXTTimeBack student id from the OneRoster-backed People & Orgs record referenced by the Ed-Fi attendance row.EAITD-014
attendanceEvent.schoolIdTEXTPeople & Orgs school id associated with the attendance moment.EAITD-014
attendanceEvent.classIdTEXTPeople & Orgs class id when the attendance row is section/class-scoped.EAITD-014
attendanceEvent.eventDatedateCalendar date the attendance event happened.EAITD-014
attendanceEvent.categoryedfi_attendance_event_category descriptor codeGoverned attendance category such as Present, Tardy, Excused Absence, or Unexcused Absence.EAITD-014
attendanceEvent.arrivedAttimeLocal time of day the student arrived for the attendance event.EAITD-014
attendanceEvent.departedAttimeLocal time of day the student departed for the attendance event.EAITD-014
attendanceEvent.durationMinutesintegerDuration in minutes from the school- or section-attendance source field.EAITD-014
attendanceEvent.isDeletedBOOLEANSoft-delete visibility flag inherited from the Ed-Fi base surface.EAITD-016

disciplineEvent

One discipline-related moment for a student or incident, read as an Alpha Events object without copying Ed-Fi discipline records.

rename + restrict
Visibility
public list + detail, redacted by role and scope
Source
edfi.canonical_record where record_kind in (DisciplineIncident, StudentDisciplineIncidentBehaviorAssociation)
Dictionary
disciplineEvent
Primary key
id
Authority
The Ed-Fi base surface owns writes, descriptors, soft-delete, draft/canonical state, and roster resolution. Events Alpha owns only the school-language read view and redaction contract.
Lifecycle
Normal app writes route through the Ed-Fi 1EdTech base surface. Production migration may use POST /source-imports with horizons_discipline_event_v1, which writes canonical Ed-Fi storage server-side and then reads through alpha.discipline_event_view. Events Alpha ships read-only list/detail routes for ordinary discipline reads.
FieldTypeMeaningTrace
disciplineEvent.idUUIDStable platform id for the canonical Ed-Fi discipline row projected as an Alpha moment.EAITD-015
disciplineEvent.incidentIdtextLocally assigned discipline incident identifier from the Ed-Fi natural key.EAITD-015
disciplineEvent.studentIdTEXTTimeBack student id when the discipline record is associated with a student.EAITD-015
disciplineEvent.schoolIdTEXTPeople & Orgs school id where the incident occurred.EAITD-015
disciplineEvent.incidentDatedateCalendar date the discipline incident occurred.EAITD-015
disciplineEvent.incidentTimetimeLocal time of day the incident took place.EAITD-015
disciplineEvent.behavioredfi_behavior descriptor codeGoverned category of behavior involved in the incident.EAITD-015
disciplineEvent.participationCodeedfi_discipline_incident_participation_code descriptor code arrayGoverned role or type of the student participation in the incident.EAITD-015
disciplineEvent.locationedfi_incident_location descriptor codeGoverned location where the incident occurred.EAITD-015
disciplineEvent.descriptiontextHuman-written incident or behavior detail when the caller is authorized to view it.EAITD-015
disciplineEvent.isDeletedBOOLEANSoft-delete visibility flag inherited from the Ed-Fi base surface.EAITD-016

eventThing

A person, app, group, resource, session, attempt, or result object named inside an event.

rename + restrict
Visibility
embedded in event detail; no standalone list endpoint
Source
caliper.entity
Dictionary
eventThing
Primary key
id
Authority
caliper.entity is the upstream projection. Alpha eventThing is a redacted detail helper, not a new People, Content, or Results record.
Lifecycle
Projected while normalizing events. Current entity view can change as new events arrive, but raw event history remains upstream evidence.
FieldTypeMeaningTrace
eventThing.iduuidStable platform id for the current projected entity named inside an event.EAITD-002
eventThing.sourceIdtextOriginal Caliper entity IRI or source id for the person, app, group, resource, session, attempt, or result object.EAITD-002
eventThing.typetextCaliper entity class preserved for provenance.EAITD-002
eventThing.nametextDisplay label only when authorization and redaction allow it.EAITD-010

trustEvidence

Internal release evidence proving docs, implementation, integration, and skill-pack checks ran.

cut public / summary only
Visibility
cut public; docs/QC/integration summary only
Source
caliper.conformance_run
Dictionary
trustEvidence
Primary key
conformance_run_id upstream only
Authority
caliper.conformance_run remains internal/1EdTech evidence.
Lifecycle
Append-only upstream evidence rows. Public Alpha surfaces trust through hosted docs and QC links, not through mutation APIs.
No public fields. This object is documented so customers know the evidence exists upstream, but public Alpha does not expose a list, detail, or mutation API for it. See Public Cuts.

eventsPolicy

Named surface configuration that owns event-kind mapping and policy numbers so consumers do not hard-code them.

extend
Visibility
surface config, read by consumers through documented config endpoints or docs
Source
alpha.policy.events.*
Dictionary
eventsPolicy
Primary key
policy key
Authority
Alpha Events policy config, backed by architecture ITDs and cross-cutting rule 4.
Lifecycle
Maintained by surface operators. Policy changes are surface changes and must not require dashboard or skill-pack code changes.
No public fields. This object is documented so customers know the evidence exists upstream, but public Alpha does not expose a list, detail, or mutation API for it. See Public Cuts.
Field Index

Every documented field with source and ITD trace

FieldPublic shapeTypeMeaningTrace
activitySource.idpublic
rename
uuid
Required
Stable TimeBack identifier for the app or service that sent activity.
Source: caliper.sensor.sensor_id
EAITD-004
activitySource.sourceIripublic
rename
text
Required
The Caliper Sensor IRI kept for provenance and exact 1EdTech traceability.
Source: caliper.sensor.sensor_iri
EAITD-004
activitySource.namepublic
rename
text
Required
Plain label shown to teachers, support, and app-builder LLMs when identifying which app sent an event.
Source: caliper.sensor.display_name
EAITD-004
activitySource.statuspublic
restrict
text
Required
Lifecycle gate that decides whether this source can send new events.
Source: caliper.sensor.status
EAITD-004
activitySource.createdAtpublic
rename
timestamptz
Required
When the activity source registration was created.
Source: caliper.sensor.created_at
EAITD-004
activitySource.updatedAtpublic
rename
timestamptz
Required
When the safe registration fields or lifecycle status last changed.
Source: caliper.sensor.updated_at
EAITD-004
activitySource.credentialRefinternal only
cut public / internal only
text
Optional
Internal pointer to credential material used by operators. It is documented here so reviewers know it is not a public Alpha field.
Source: caliper.sensor.credential_ref
EAITD-004
activitySource.metadatainternal only
cut public / internal only
jsonb
Required
Internal operational metadata for the source registration.
Source: caliper.sensor.metadata
EAITD-004, EAITD-010
eventBatch.sentAtpublic
rename
timestamptz
Required
When the sending app says it sent the batch.
Source: caliper.envelope.send_time
EAITD-005
eventBatch.receivedAtpublic
rename
timestamptz
Required
When TimeBack received the batch.
Source: caliper.envelope.received_at
EAITD-005
eventBatch.statuspublic
rename + restrict
text
Required
Processing state for the batch that carried one or more events.
Source: caliper.envelope.envelope_status
EAITD-005
eventBatch.rawEnvelopeinternal only
cut public / internal only
jsonb
Required
The raw Caliper JSON-LD envelope is preserved upstream for audit, replay, and 1EdTech evidence, but is cut from public Alpha.
Source: caliper.envelope.raw_envelope
EAITD-008, EAITD-010
event.idpublic
rename
uuid
Required
Stable TimeBack id for one normalized activity-stream moment.
Source: caliper.event.event_row_id
EAITD-002
event.sourceEventIdpublic
rename
text
Required
Stable id supplied by the source or generated as a Caliper event IRI when Alpha accepts a plain event.
Source: caliper.event.event_iri
EAITD-005
event.eventTypepublic
rename
text
Required
Caliper Event subclass kept for provenance and advanced filters.
Source: caliper.event.event_type
EAITD-002
event.profilepublic
rename
text
Required
Caliper profile kept for provenance and kind derivation.
Source: caliper.event.profile
EAITD-002
event.actionpublic
rename
text
Required
Typed Caliper action describing what the actor did.
Source: caliper.event.action
EAITD-002
event.kindpublic
extend + restrict
text
Required
Plain, governed event category used by teachers, students, parents, app-builder LLMs, and reports.
Source: caliper.event.event_type + caliper.event.profile + caliper.event.action + alpha.policy.events.kind_map
EAITD-007
event.actorRefpublic
rename
jsonb
Required
Original Caliper actor reference or redacted actor object for the person, app, or organization that acted.
Source: caliper.event.actor
EAITD-002
event.studentIdpublic
extend + restrict
text
Optional
Plain TimeBack student id when the actor resolves to a known student.
Source: caliper.event.actor + caliper.entity + People & Orgs user
EAITD-006
event.objectRefpublic
rename
jsonb
Required
Original Caliper object reference or redacted object acted on by the actor.
Source: caliper.event.object
EAITD-002
event.contentIdpublic
extend + restrict
text
Optional
The single Content join key for Events: the Content module id when the object or target resolves to a known article, video, question, test, lesson, or other content item.
Source: caliper.event.object + caliper.event.target + Content item
EAITD-006
event.appRefpublic
rename
jsonb
Optional
App named inside the event, distinct from the activitySource that delivered the event.
Source: caliper.event.ed_app
EAITD-002
event.activitySourceIdpublic
rename
uuid
Optional
Registered activity source that delivered the event.
Source: caliper.envelope.sensor_id
EAITD-004
event.groupRefpublic
rename
jsonb
Optional
Original Caliper group or cohort context.
Source: caliper.event.group_entity
EAITD-002
event.orgIdpublic
extend + restrict
text
Optional
People & Orgs organization id when the group context resolves to a known school, class, campus, or org as of happenedAt.
Source: caliper.event.group_entity + People & Orgs org
EAITD-006
event.generatedRefpublic
rename + restrict
jsonb
Optional
Generated output reference, such as an attempt, response, or Results-owned result reference.
Source: caliper.event.generated
EAITD-003
event.targetRefpublic
rename
jsonb
Optional
Target entity for navigation, launch, move, or media actions.
Source: caliper.event.target
EAITD-002
event.referrerRefpublic
rename
jsonb
Optional
Referring resource for navigation or reading activity.
Source: caliper.event.referrer
EAITD-002
event.sessionRefpublic
rename
jsonb
Optional
Session correlation reference across tools.
Source: caliper.event.federated_session
EAITD-002
event.happenedAtpublic
rename
timestamptz
Required
When the activity happened and the formal as-of key for People & Orgs joins.
Source: caliper.event.event_time
EAITD-002
event.receivedAtpublic
rename
timestamptz
Required
When TimeBack received the batch that carried this event.
Source: caliper.envelope.received_at
EAITD-005
event.extensionspublic
restrict
jsonb
Required
Governed, non-secret, redacted extension values that remain after official Caliper fields are normalized.
Source: caliper.event.event_extensions
EAITD-010
event.rawPayloadinternal only
cut public / internal only
jsonb
Required
Raw Caliper event payload preserved upstream for 1EdTech audit/replay. It is not a public Alpha field.
Source: caliper.event.raw_event
EAITD-008
attendanceEvent.idpublic
rename
UUID
required
Stable platform id for the canonical Ed-Fi attendance record projected as an Alpha moment.
Source: edfi.canonical_record.edfi_local_id
EAITD-014
attendanceEvent.sourceRecordKindpublic
rename + restrict
text enum
Required
Which approved Ed-Fi attendance resource produced this moment.
Source: edfi.canonical_record.record_kind
EAITD-014
attendanceEvent.studentIdpublic
rename
TEXT
conditional
TimeBack student id from the OneRoster-backed People & Orgs record referenced by the Ed-Fi attendance row.
Source: edfi.canonical_record.student_sourced_id
EAITD-014
attendanceEvent.schoolIdpublic
rename
TEXT
conditional
People & Orgs school id associated with the attendance moment.
Source: edfi.canonical_record.school_sourced_id
EAITD-014
attendanceEvent.classIdpublic
rename
TEXT
Optional
People & Orgs class id when the attendance row is section/class-scoped.
Source: edfi.canonical_record.class_sourced_id
EAITD-014
attendanceEvent.eventDatepublic
rename
date
required
Calendar date the attendance event happened.
Source: edfi.canonical_record.payload_json.AttendanceEvent.EventDate
EAITD-014
attendanceEvent.categorypublic
rename + restrict
edfi_attendance_event_category descriptor code
required
Governed attendance category such as Present, Tardy, Excused Absence, or Unexcused Absence.
Source: edfi.canonical_record.payload_json.AttendanceEvent.AttendanceEventCategoryDescriptor + edfi.edfi_descriptor_code
EAITD-014
attendanceEvent.arrivedAtpublic
rename
time
Optional
Local time of day the student arrived for the attendance event.
Source: edfi.canonical_record.payload_json.ArrivalTime
EAITD-014
attendanceEvent.departedAtpublic
rename
time
Optional
Local time of day the student departed for the attendance event.
Source: edfi.canonical_record.payload_json.DepartureTime
EAITD-014
attendanceEvent.durationMinutespublic
rename + restrict
integer
Optional
Duration in minutes from the school- or section-attendance source field.
Source: edfi.canonical_record.payload_json.SchoolAttendanceDuration or payload_json.SectionAttendanceDuration
EAITD-014
attendanceEvent.isDeletedpublic
rename + restrict
BOOLEAN
required, default false
Soft-delete visibility flag inherited from the Ed-Fi base surface.
Source: edfi.canonical_record.is_deleted
EAITD-016
disciplineEvent.idpublic
rename
UUID
required
Stable platform id for the canonical Ed-Fi discipline row projected as an Alpha moment.
Source: edfi.canonical_record.edfi_local_id
EAITD-015
disciplineEvent.incidentIdpublic
rename
text
Required
Locally assigned discipline incident identifier from the Ed-Fi natural key.
Source: edfi.canonical_record.source_key_json.IncidentIdentifier
EAITD-015
disciplineEvent.studentIdpublic
rename
TEXT
Optional
TimeBack student id when the discipline record is associated with a student.
Source: edfi.canonical_record.student_sourced_id
EAITD-015
disciplineEvent.schoolIdpublic
rename
TEXT
conditional
People & Orgs school id where the incident occurred.
Source: edfi.canonical_record.school_sourced_id
EAITD-015
disciplineEvent.incidentDatepublic
rename
date
required
Calendar date the discipline incident occurred.
Source: edfi.canonical_record.payload_json.IncidentDate
EAITD-015
disciplineEvent.incidentTimepublic
rename
time
Optional
Local time of day the incident took place.
Source: edfi.canonical_record.payload_json.IncidentTime
EAITD-015
disciplineEvent.behaviorpublic
rename + restrict
edfi_behavior descriptor code
required
Governed category of behavior involved in the incident.
Source: edfi.canonical_record.payload_json.BehaviorDescriptor + edfi.edfi_descriptor_code
EAITD-015
disciplineEvent.participationCodepublic
rename + restrict
edfi_discipline_incident_participation_code descriptor code array
Optional collection
Governed role or type of the student participation in the incident.
Source: edfi.canonical_record.payload_json.DisciplineIncidentParticipationCodes + edfi.edfi_descriptor_code
EAITD-015
disciplineEvent.locationpublic
rename + restrict
edfi_incident_location descriptor code
Optional
Governed location where the incident occurred.
Source: edfi.canonical_record.payload_json.IncidentLocationDescriptor + edfi.edfi_descriptor_code
EAITD-015
disciplineEvent.descriptionpublic
restrict
text
Optional
Human-written incident or behavior detail when the caller is authorized to view it.
Source: edfi.canonical_record.payload_json.IncidentDescription or payload_json.BehaviorDetailedDescription
EAITD-015
disciplineEvent.isDeletedpublic
rename + restrict
BOOLEAN
required, default false
Soft-delete visibility flag inherited from the Ed-Fi base surface.
Source: edfi.canonical_record.is_deleted
EAITD-016
eventThing.idpublic
rename
uuid
Required
Stable platform id for the current projected entity named inside an event.
Source: caliper.entity.entity_row_id
EAITD-002
eventThing.sourceIdpublic
rename
text
Required
Original Caliper entity IRI or source id for the person, app, group, resource, session, attempt, or result object.
Source: caliper.entity.entity_iri
EAITD-002
eventThing.typepublic
rename
text
Required
Caliper entity class preserved for provenance.
Source: caliper.entity.entity_type
EAITD-002
eventThing.namepublic
rename + restrict
text
Optional
Display label only when authorization and redaction allow it.
Source: caliper.entity.name
EAITD-010
trustEvidence.conformance_run_idinternal only
cut public / internal evidence only
uuid
Required
Stable identifier for one local conformance, documentation, implementation, or integration evidence run. Public Alpha gets hosted evidence links through docs, QC, integration, and skill pack, not a mutation API for this row.
Source: caliper.conformance_run.conformance_run_id
EAITD-008, EAITD-110
trustEvidence.tenant_idinternal only
cut public / internal evidence only
uuid
Optional
Optional platform tenant associated with this evidence run. Public Alpha gets hosted evidence links through docs, QC, integration, and skill pack, not a mutation API for this row.
Source: caliper.conformance_run.tenant_id
EAITD-008, EAITD-110
trustEvidence.source_nameinternal only
cut public / internal evidence only
text
Required
Name of the local or external gate that produced the evidence. Public Alpha gets hosted evidence links through docs, QC, integration, and skill pack, not a mutation API for this row.
Source: caliper.conformance_run.source_name
EAITD-008, EAITD-110
trustEvidence.source_versioninternal only
cut public / internal evidence only
text
Required
Version, commit, source bundle, or artifact label used by the evidence run. Public Alpha gets hosted evidence links through docs, QC, integration, and skill pack, not a mutation API for this row.
Source: caliper.conformance_run.source_version
EAITD-008, EAITD-110
trustEvidence.resultinternal only
cut public / internal evidence only
text
Required
Outcome of the evidence run. Public Alpha gets hosted evidence links through docs, QC, integration, and skill pack, not a mutation API for this row.
Source: caliper.conformance_run.result
EAITD-008, EAITD-110
trustEvidence.evidenceinternal only
cut public / internal evidence only
jsonb
Required
Structured, redacted evidence payload from the run. Public Alpha gets hosted evidence links through docs, QC, integration, and skill pack, not a mutation API for this row.
Source: caliper.conformance_run.evidence
EAITD-008, EAITD-110
trustEvidence.started_atinternal only
cut public / internal evidence only
timestamptz
Required
Timestamp when the evidence run started. Public Alpha gets hosted evidence links through docs, QC, integration, and skill pack, not a mutation API for this row.
Source: caliper.conformance_run.started_at
EAITD-008, EAITD-110
trustEvidence.finished_atinternal only
cut public / internal evidence only
timestamptz
Required
Timestamp when the evidence run finished. Public Alpha gets hosted evidence links through docs, QC, integration, and skill pack, not a mutation API for this row.
Source: caliper.conformance_run.finished_at
EAITD-008, EAITD-110
eventsPolicy.kindMapsurface config
extend
json object
Required
Maintained mapping from Caliper eventType/profile/action tuples and approved aliases to canonical event.kind values.
Source: alpha.policy.events.kind_map
EAITD-007
eventsPolicy.pageSizesurface config
extend
json object
Required
Default and maximum page-size bounds for cursor-paged activity-stream reads.
Source: alpha.policy.events.page_size
EAITD-009, EAITD-103
eventsPolicy.minuteBucketRulesurface config
extend
string or json object
Optional until a minutes report is published
Named rule used when Events exposes activity minutes to downstream reports.
Source: alpha.policy.events.minute_bucket_rule
EAITD-009
Allowed Values

Alpha values first, Caliper values preserved for provenance

Alpha app builders usually filter by alpha_event_kind. Caliper eventType, profile, action, and entity type remain visible for provenance and advanced filters.

Alpha governed values

alpha_event_kind

12 documented values. Canonical dictionary anchor: alpha_event_kind.

Alpha governed set
ValueMeaningUse whenInvalid whenSourceTrace
app_openedA student, teacher, or app-builder agent opened or launched a learning app.Use when a ToolLaunchEvent or ToolUseEvent with Launched or Used marks app entry.Invalid when the same moment is better represented by another canonical kind, when the source tuple is unknown and not policy-mapped, or when the caller invents a non-registry string.Alpha extension
Derived once from caliper.event.event_type, caliper.event.profile, caliper.event.action, and alpha.policy.events.kind_map.
EAITD-007
content_viewedA student viewed a content item such as an article, page, lesson, image, or question stem.Use for ViewEvent or ReadingProfile activity where the object resolves to Content.Invalid when the same moment is better represented by another canonical kind, when the source tuple is unknown and not policy-mapped, or when the caller invents a non-registry string.Alpha extension
Derived once from caliper.event.event_type, caliper.event.profile, caliper.event.action, and alpha.policy.events.kind_map.
EAITD-007
video_startedA student started playing a video content item.Use for MediaEvent activity with action Started and a video object.Invalid when the same moment is better represented by another canonical kind, when the source tuple is unknown and not policy-mapped, or when the caller invents a non-registry string.Alpha extension
Derived once from caliper.event.event_type, caliper.event.profile, caliper.event.action, and alpha.policy.events.kind_map.
EAITD-007
video_scrubbedA student jumped, rewound, skipped, or changed position in a video.Use for MediaEvent position-changing actions. The exact position is an extension only if governed and non-secret.Invalid when the same moment is better represented by another canonical kind, when the source tuple is unknown and not policy-mapped, or when the caller invents a non-registry string.Alpha extension
Derived once from caliper.event.event_type, caliper.event.profile, caliper.event.action, and alpha.policy.events.kind_map.
EAITD-007
hint_requestedA student asked for help or requested a hint while working.Use only when alpha.policy.events.kind_map folds the source event to this canonical kind.Invalid when the same moment is better represented by another canonical kind, when the source tuple is unknown and not policy-mapped, or when the caller invents a non-registry string.Alpha extension
Derived once from caliper.event.event_type, caliper.event.profile, caliper.event.action, and alpha.policy.events.kind_map.
EAITD-007
question_answeredA student answered an item or question.Use for item-level assessment activity that marks an answer moment, whether or not a durable score exists yet.Invalid when the same moment is better represented by another canonical kind, when the source tuple is unknown and not policy-mapped, or when the caller invents a non-registry string.Alpha extension
Derived once from caliper.event.event_type, caliper.event.profile, caliper.event.action, and alpha.policy.events.kind_map.
EAITD-007
assessment_startedA student started an assessment, quiz, placement, or test sitting.Use when the event starts the attempt but does not by itself settle the score.Invalid when the same moment is better represented by another canonical kind, when the source tuple is unknown and not policy-mapped, or when the caller invents a non-registry string.Alpha extension
Derived once from caliper.event.event_type, caliper.event.profile, caliper.event.action, and alpha.policy.events.kind_map.
EAITD-007
assessment_submittedA student submitted an assessment attempt.Use for the submission moment. The scored outcome belongs in Results.Invalid when the same moment is better represented by another canonical kind, when the source tuple is unknown and not policy-mapped, or when the caller invents a non-registry string.Alpha extension
Derived once from caliper.event.event_type, caliper.event.profile, caliper.event.action, and alpha.policy.events.kind_map.
EAITD-007
lesson_finishedA student completed or finished a lesson or assignable learning unit.Use for assignable or resource activity where completion is the event, not the durable grade.Invalid when the same moment is better represented by another canonical kind, when the source tuple is unknown and not policy-mapped, or when the caller invents a non-registry string.Alpha extension
Derived once from caliper.event.event_type, caliper.event.profile, caliper.event.action, and alpha.policy.events.kind_map.
EAITD-007
search_runA student, teacher, or app ran a search inside a learning context.Use for search events where the query text is redacted unless policy allows it.Invalid when the same moment is better represented by another canonical kind, when the source tuple is unknown and not policy-mapped, or when the caller invents a non-registry string.Alpha extension
Derived once from caliper.event.event_type, caliper.event.profile, caliper.event.action, and alpha.policy.events.kind_map.
EAITD-007
feedback_viewedA student or teacher viewed feedback.Use when the moment is seeing feedback, not writing a score or gradebook entry.Invalid when the same moment is better represented by another canonical kind, when the source tuple is unknown and not policy-mapped, or when the caller invents a non-registry string.Alpha extension
Derived once from caliper.event.event_type, caliper.event.profile, caliper.event.action, and alpha.policy.events.kind_map.
EAITD-007
session_joinedA student joined, logged into, or started a session.Use for session activity where the event marks participation in a tool or class session.Invalid when the same moment is better represented by another canonical kind, when the source tuple is unknown and not policy-mapped, or when the caller invents a non-registry string.Alpha extension
Derived once from caliper.event.event_type, caliper.event.profile, caliper.event.action, and alpha.policy.events.kind_map.
EAITD-007

alpha_activity_source_status

3 documented values. Canonical dictionary anchor: alpha_activity_source_status.

Alpha governed set
ValueMeaningUse whenInvalid whenSourceTrace
activeThe registered sensor may send envelopes for this tenant.Use after credentials and tenant authorization are configured.Invalid when the sensor should be blocked, retired, or unknown.Platform gap fill
Caliper defines Sensors but not tenant-specific sender lifecycle state.
EAITD-004
pausedThe sensor is temporarily blocked without deleting its registration.Use during incident response, credential rotation, or customer-requested pause.Invalid for a sensor that is actively receiving production traffic.Platform gap fill
Caliper defines Sensors but not tenant-specific sender lifecycle state.
EAITD-004
retiredThe sensor registration is retained for history but no longer accepts new envelopes.Use after a sender integration is permanently decommissioned.Invalid when the sensor might resume ordinary writes.Platform gap fill
Caliper defines Sensors but not tenant-specific sender lifecycle state.
EAITD-004

alpha_event_batch_status

4 documented values. Canonical dictionary anchor: alpha_event_batch_status.

Alpha governed set
ValueMeaningUse whenInvalid whenSourceTrace
receivedThe endpoint accepted the transport unit and recorded receipt before normalization finished.Use while downstream event/entity projection is in progress.Invalid after projection has completed or failed.Platform gap fill
Envelope processing state is a platform persistence gap fill around the Sensor API transport unit.
EAITD-005
processedThe envelope was accepted, normalized, and projected into the event/entity tables.Use for ordinary successful Sensor API deliveries.Invalid when any required event is rejected.Platform gap fill
Envelope processing state is a platform persistence gap fill around the Sensor API transport unit.
EAITD-005
rejectedThe envelope was received but failed shape, vocabulary, auth, tenant, sensor, or privacy validation.Use when rejection evidence must be retained without treating the payload as usable activity.Invalid for an envelope that produced normalized events.Platform gap fill
Envelope processing state is a platform persistence gap fill around the Sensor API transport unit.
EAITD-005
duplicateThe envelope is a safe replay of an already-seen canonical envelope for the same tenant.Use when the canonical envelope hash already exists and no second event row should be created.Invalid when the repeated request has different content or a different tenant.Platform gap fill
Envelope processing state is a platform persistence gap fill around the Sensor API transport unit.
EAITD-005

alpha_attendance_source_record_kind

2 documented values. Canonical dictionary anchor: alpha_attendance_source_record_kind.

Alpha governed set
ValueMeaningUse whenInvalid whenSourceTrace
StudentSchoolAttendanceEventA school-day attendance event for one student.Use when the source record is the Ed-Fi studentSchoolAttendanceEvents resource.Invalid for class/section attendance rows or program/intervention attendance rows.
EAITD-014
StudentSectionAttendanceEventA section/class attendance event for one student.Use when the source record is the Ed-Fi studentSectionAttendanceEvents resource.Invalid for school-day attendance rows or generic class period records.
EAITD-014

Caliper pass-through values

edfi_attendance_event_category

7 documented values. Canonical dictionary anchor: edfi_attendance_event_category.

Caliper pass-through
ValueMeaningUse whenInvalid whenSourceTrace
Early departureEarly departureed_fi_standard value in uri://ed-fi.org/AttendanceEventCategoryDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-014, EAITD-016
Excused AbsenceExcused Absenceed_fi_standard value in uri://ed-fi.org/AttendanceEventCategoryDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-014, EAITD-016
In AttendanceIn Attendanceed_fi_standard value in uri://ed-fi.org/AttendanceEventCategoryDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-014, EAITD-016
PartialPartialed_fi_standard value in uri://ed-fi.org/AttendanceEventCategoryDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-014, EAITD-016
PresentPresented_fi_standard value in uri://ed-fi.org/AttendanceEventCategoryDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-014, EAITD-016
TardyTardyed_fi_standard value in uri://ed-fi.org/AttendanceEventCategoryDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-014, EAITD-016
Unexcused AbsenceUnexcused Absenceed_fi_standard value in uri://ed-fi.org/AttendanceEventCategoryDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-014, EAITD-016

edfi_behavior

4 documented values. Canonical dictionary anchor: edfi_behavior.

Caliper pass-through
ValueMeaningUse whenInvalid whenSourceTrace
OtherOthered_fi_standard value in uri://ed-fi.org/BehaviorDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016
School Code of ConductSchool Code of Conducted_fi_standard value in uri://ed-fi.org/BehaviorDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016
School ViolationSchool Violationed_fi_standard value in uri://ed-fi.org/BehaviorDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016
State OffenseState Offenseed_fi_standard value in uri://ed-fi.org/BehaviorDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016

edfi_discipline_incident_participation_code

4 documented values. Canonical dictionary anchor: edfi_discipline_incident_participation_code.

Caliper pass-through
ValueMeaningUse whenInvalid whenSourceTrace
PerpetratorPerpetratored_fi_standard value in uri://ed-fi.org/DisciplineIncidentParticipationCodeDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016
ReporterReportered_fi_standard value in uri://ed-fi.org/DisciplineIncidentParticipationCodeDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016
VictimVictimed_fi_standard value in uri://ed-fi.org/DisciplineIncidentParticipationCodeDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016
WitnessWitnessed_fi_standard value in uri://ed-fi.org/DisciplineIncidentParticipationCodeDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016

edfi_incident_location

25 documented values. Canonical dictionary anchor: edfi_incident_location.

Caliper pass-through
ValueMeaningUse whenInvalid whenSourceTrace
Administrative offices areaAdministrative offices areaed_fi_standard value in uri://ed-fi.org/IncidentLocationDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016
Athletic field or playgroundAthletic field or playgrounded_fi_standard value in uri://ed-fi.org/IncidentLocationDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016
AuditoriumAuditoriumed_fi_standard value in uri://ed-fi.org/IncidentLocationDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016
Bus stopBus stoped_fi_standard value in uri://ed-fi.org/IncidentLocationDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016
Cafeteria areaCafeteria areaed_fi_standard value in uri://ed-fi.org/IncidentLocationDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016
ClassroomClassroomed_fi_standard value in uri://ed-fi.org/IncidentLocationDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016
Computer labComputer labed_fi_standard value in uri://ed-fi.org/IncidentLocationDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016
Hallway or stairsHallway or stairsed_fi_standard value in uri://ed-fi.org/IncidentLocationDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016
Library/media centerLibrary/media centered_fi_standard value in uri://ed-fi.org/IncidentLocationDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016
Locker room or gym areasLocker room or gym areased_fi_standard value in uri://ed-fi.org/IncidentLocationDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016
Off campusOff campused_fi_standard value in uri://ed-fi.org/IncidentLocationDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016
Off-campus at a school sponsored activityOff-campus at a school sponsored activityed_fi_standard value in uri://ed-fi.org/IncidentLocationDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016
Off-campus at another location unrelated to schoolOff-campus at another location unrelated to schooled_fi_standard value in uri://ed-fi.org/IncidentLocationDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016
Off-campus at other schoolOff-campus at other schooled_fi_standard value in uri://ed-fi.org/IncidentLocationDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016
Off-campus at other school district facilityOff-campus at other school district facilityed_fi_standard value in uri://ed-fi.org/IncidentLocationDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016
On campusOn campused_fi_standard value in uri://ed-fi.org/IncidentLocationDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016
On-campus other inside areaOn-campus other inside areaed_fi_standard value in uri://ed-fi.org/IncidentLocationDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016
On-campus other outside areaOn-campus other outside areaed_fi_standard value in uri://ed-fi.org/IncidentLocationDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016
OnlineOnlineed_fi_standard value in uri://ed-fi.org/IncidentLocationDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016
Parking lotParking loted_fi_standard value in uri://ed-fi.org/IncidentLocationDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016
RestroomRestroomed_fi_standard value in uri://ed-fi.org/IncidentLocationDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016
School busSchool bused_fi_standard value in uri://ed-fi.org/IncidentLocationDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016
StadiumStadiumed_fi_standard value in uri://ed-fi.org/IncidentLocationDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016
UnknownUnknowned_fi_standard value in uri://ed-fi.org/IncidentLocationDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016
Walking to or from schoolWalking to or from schooled_fi_standard value in uri://ed-fi.org/IncidentLocationDescriptor.Invalid when not present in the governed descriptor registry for the tenant, outside its effective date window, or supplied as ungoverned free text.
EAITD-015, EAITD-016

caliper_event_type

21 documented values. Canonical dictionary anchor: caliper_event_type.

Caliper pass-through
ValueMeaningUse whenInvalid whenSourceTrace
AnnotationEventA Caliper event class for annotation activity. Normalized rows use AnnotationProfile unless the sender supplies a compatible explicit profile.Use when the event object's Caliper type is exactly AnnotationEvent.Invalid when capitalization differs, the JSON-LD type is not AnnotationEvent, or the value is an entity class rather than an event class.1EdTech pass-through
Caliper Analytics 1.2 event-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
AssessmentEventA Caliper event class for assessment activity. Normalized rows use AssessmentProfile unless the sender supplies a compatible explicit profile.Use when the event object's Caliper type is exactly AssessmentEvent.Invalid when capitalization differs, the JSON-LD type is not AssessmentEvent, or the value is an entity class rather than an event class.1EdTech pass-through
Caliper Analytics 1.2 event-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
AssessmentItemEventA Caliper event class for assessment item activity. Normalized rows use AssessmentProfile unless the sender supplies a compatible explicit profile.Use when the event object's Caliper type is exactly AssessmentItemEvent.Invalid when capitalization differs, the JSON-LD type is not AssessmentItemEvent, or the value is an entity class rather than an event class.1EdTech pass-through
Caliper Analytics 1.2 event-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
AssignableEventA Caliper event class for assignable activity. Normalized rows use AssignableProfile unless the sender supplies a compatible explicit profile.Use when the event object's Caliper type is exactly AssignableEvent.Invalid when capitalization differs, the JSON-LD type is not AssignableEvent, or the value is an entity class rather than an event class.1EdTech pass-through
Caliper Analytics 1.2 event-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
FeedbackEventA Caliper event class for feedback activity. Normalized rows use FeedbackProfile unless the sender supplies a compatible explicit profile.Use when the event object's Caliper type is exactly FeedbackEvent.Invalid when capitalization differs, the JSON-LD type is not FeedbackEvent, or the value is an entity class rather than an event class.1EdTech pass-through
Caliper Analytics 1.2 event-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ForumEventA Caliper event class for forum activity. Normalized rows use ForumProfile unless the sender supplies a compatible explicit profile.Use when the event object's Caliper type is exactly ForumEvent.Invalid when capitalization differs, the JSON-LD type is not ForumEvent, or the value is an entity class rather than an event class.1EdTech pass-through
Caliper Analytics 1.2 event-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
GradeEventA Caliper event class for grade activity. Normalized rows use GradingProfile unless the sender supplies a compatible explicit profile.Use when the event object's Caliper type is exactly GradeEvent.Invalid when capitalization differs, the JSON-LD type is not GradeEvent, or the value is an entity class rather than an event class.1EdTech pass-through
Caliper Analytics 1.2 event-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
MediaEventA Caliper event class for media activity. Normalized rows use MediaProfile unless the sender supplies a compatible explicit profile.Use when the event object's Caliper type is exactly MediaEvent.Invalid when capitalization differs, the JSON-LD type is not MediaEvent, or the value is an entity class rather than an event class.1EdTech pass-through
Caliper Analytics 1.2 event-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
MessageEventA Caliper event class for message activity. Normalized rows use ForumProfile unless the sender supplies a compatible explicit profile.Use when the event object's Caliper type is exactly MessageEvent.Invalid when capitalization differs, the JSON-LD type is not MessageEvent, or the value is an entity class rather than an event class.1EdTech pass-through
Caliper Analytics 1.2 event-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
NavigationEventA Caliper event class for navigation activity. Normalized rows use GeneralProfile unless the sender supplies a compatible explicit profile.Use when the event object's Caliper type is exactly NavigationEvent.Invalid when capitalization differs, the JSON-LD type is not NavigationEvent, or the value is an entity class rather than an event class.1EdTech pass-through
Caliper Analytics 1.2 event-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
QuestionnaireEventA Caliper event class for questionnaire activity. Normalized rows use SurveyProfile unless the sender supplies a compatible explicit profile.Use when the event object's Caliper type is exactly QuestionnaireEvent.Invalid when capitalization differs, the JSON-LD type is not QuestionnaireEvent, or the value is an entity class rather than an event class.1EdTech pass-through
Caliper Analytics 1.2 event-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
QuestionnaireItemEventA Caliper event class for questionnaire item activity. Normalized rows use SurveyProfile unless the sender supplies a compatible explicit profile.Use when the event object's Caliper type is exactly QuestionnaireItemEvent.Invalid when capitalization differs, the JSON-LD type is not QuestionnaireItemEvent, or the value is an entity class rather than an event class.1EdTech pass-through
Caliper Analytics 1.2 event-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ResourceManagementEventA Caliper event class for resource management activity. Normalized rows use ResourceManagementProfile unless the sender supplies a compatible explicit profile.Use when the event object's Caliper type is exactly ResourceManagementEvent.Invalid when capitalization differs, the JSON-LD type is not ResourceManagementEvent, or the value is an entity class rather than an event class.1EdTech pass-through
Caliper Analytics 1.2 event-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
SearchEventA Caliper event class for search activity. Normalized rows use SearchProfile unless the sender supplies a compatible explicit profile.Use when the event object's Caliper type is exactly SearchEvent.Invalid when capitalization differs, the JSON-LD type is not SearchEvent, or the value is an entity class rather than an event class.1EdTech pass-through
Caliper Analytics 1.2 event-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
SessionEventA Caliper event class for session activity. Normalized rows use SessionProfile unless the sender supplies a compatible explicit profile.Use when the event object's Caliper type is exactly SessionEvent.Invalid when capitalization differs, the JSON-LD type is not SessionEvent, or the value is an entity class rather than an event class.1EdTech pass-through
Caliper Analytics 1.2 event-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
SurveyEventA Caliper event class for survey activity. Normalized rows use SurveyProfile unless the sender supplies a compatible explicit profile.Use when the event object's Caliper type is exactly SurveyEvent.Invalid when capitalization differs, the JSON-LD type is not SurveyEvent, or the value is an entity class rather than an event class.1EdTech pass-through
Caliper Analytics 1.2 event-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
SurveyInvitationEventA Caliper event class for survey invitation activity. Normalized rows use SurveyProfile unless the sender supplies a compatible explicit profile.Use when the event object's Caliper type is exactly SurveyInvitationEvent.Invalid when capitalization differs, the JSON-LD type is not SurveyInvitationEvent, or the value is an entity class rather than an event class.1EdTech pass-through
Caliper Analytics 1.2 event-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ThreadEventA Caliper event class for thread activity. Normalized rows use ForumProfile unless the sender supplies a compatible explicit profile.Use when the event object's Caliper type is exactly ThreadEvent.Invalid when capitalization differs, the JSON-LD type is not ThreadEvent, or the value is an entity class rather than an event class.1EdTech pass-through
Caliper Analytics 1.2 event-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ToolLaunchEventA Caliper event class for tool launch activity. Normalized rows use ToolLaunchProfile unless the sender supplies a compatible explicit profile.Use when the event object's Caliper type is exactly ToolLaunchEvent.Invalid when capitalization differs, the JSON-LD type is not ToolLaunchEvent, or the value is an entity class rather than an event class.1EdTech pass-through
Caliper Analytics 1.2 event-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ToolUseEventA Caliper event class for tool use activity. Normalized rows use ToolUseProfile unless the sender supplies a compatible explicit profile.Use when the event object's Caliper type is exactly ToolUseEvent.Invalid when capitalization differs, the JSON-LD type is not ToolUseEvent, or the value is an entity class rather than an event class.1EdTech pass-through
Caliper Analytics 1.2 event-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ViewEventA Caliper event class for view activity. Normalized rows use GeneralProfile unless the sender supplies a compatible explicit profile.Use when the event object's Caliper type is exactly ViewEvent.Invalid when capitalization differs, the JSON-LD type is not ViewEvent, or the value is an entity class rather than an event class.1EdTech pass-through
Caliper Analytics 1.2 event-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference

caliper_profile

15 documented values. Canonical dictionary anchor: caliper_profile.

Caliper pass-through
ValueMeaningUse whenInvalid whenSourceTrace
AnnotationProfileGroups events about creating, sharing, viewing, or managing annotations.Use when the sender supplies AnnotationProfile, or when profile inference from event type selects AnnotationProfile.Invalid when AnnotationProfile conflicts with the event type or is spelled differently from the Caliper term.1EdTech pass-through
Caliper Analytics 1.2 profile vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
AssessmentProfileGroups assessment and assessment-item activity such as starting, completing, submitting, or grading assessment work.Use when the sender supplies AssessmentProfile, or when profile inference from event type selects AssessmentProfile.Invalid when AssessmentProfile conflicts with the event type or is spelled differently from the Caliper term.1EdTech pass-through
Caliper Analytics 1.2 profile vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
AssignableProfileGroups activity around assignable digital resources.Use when the sender supplies AssignableProfile, or when profile inference from event type selects AssignableProfile.Invalid when AssignableProfile conflicts with the event type or is spelled differently from the Caliper term.1EdTech pass-through
Caliper Analytics 1.2 profile vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
FeedbackProfileGroups feedback activity between learners, educators, and tools.Use when the sender supplies FeedbackProfile, or when profile inference from event type selects FeedbackProfile.Invalid when FeedbackProfile conflicts with the event type or is spelled differently from the Caliper term.1EdTech pass-through
Caliper Analytics 1.2 profile vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ForumProfileGroups forum, thread, message, and discussion activity.Use when the sender supplies ForumProfile, or when profile inference from event type selects ForumProfile.Invalid when ForumProfile conflicts with the event type or is spelled differently from the Caliper term.1EdTech pass-through
Caliper Analytics 1.2 profile vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
GradingProfileGroups grade, score, and result activity.Use when the sender supplies GradingProfile, or when profile inference from event type selects GradingProfile.Invalid when GradingProfile conflicts with the event type or is spelled differently from the Caliper term.1EdTech pass-through
Caliper Analytics 1.2 profile vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
MediaProfileGroups audio, video, image, and media playback activity.Use when the sender supplies MediaProfile, or when profile inference from event type selects MediaProfile.Invalid when MediaProfile conflicts with the event type or is spelled differently from the Caliper term.1EdTech pass-through
Caliper Analytics 1.2 profile vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ReadingProfileGroups reading, viewing, bookmarking, highlighting, and navigation activity over resources.Use when the sender supplies ReadingProfile, or when profile inference from event type selects ReadingProfile.Invalid when ReadingProfile conflicts with the event type or is spelled differently from the Caliper term.1EdTech pass-through
Caliper Analytics 1.2 profile vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ResourceManagementProfileGroups resource creation, update, copy, publish, archive, and deletion activity.Use when the sender supplies ResourceManagementProfile, or when profile inference from event type selects ResourceManagementProfile.Invalid when ResourceManagementProfile conflicts with the event type or is spelled differently from the Caliper term.1EdTech pass-through
Caliper Analytics 1.2 profile vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
SearchProfileGroups search query and search result activity.Use when the sender supplies SearchProfile, or when profile inference from event type selects SearchProfile.Invalid when SearchProfile conflicts with the event type or is spelled differently from the Caliper term.1EdTech pass-through
Caliper Analytics 1.2 profile vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
SessionProfileGroups login, logout, session start, session end, and federated-session activity.Use when the sender supplies SessionProfile, or when profile inference from event type selects SessionProfile.Invalid when SessionProfile conflicts with the event type or is spelled differently from the Caliper term.1EdTech pass-through
Caliper Analytics 1.2 profile vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
SurveyProfileGroups survey, questionnaire, survey invitation, and questionnaire item activity.Use when the sender supplies SurveyProfile, or when profile inference from event type selects SurveyProfile.Invalid when SurveyProfile conflicts with the event type or is spelled differently from the Caliper term.1EdTech pass-through
Caliper Analytics 1.2 profile vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ToolLaunchProfileGroups tool launch activity, including LTI or app launches.Use when the sender supplies ToolLaunchProfile, or when profile inference from event type selects ToolLaunchProfile.Invalid when ToolLaunchProfile conflicts with the event type or is spelled differently from the Caliper term.1EdTech pass-through
Caliper Analytics 1.2 profile vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ToolUseProfileGroups general tool-use activity after a tool has launched.Use when the sender supplies ToolUseProfile, or when profile inference from event type selects ToolUseProfile.Invalid when ToolUseProfile conflicts with the event type or is spelled differently from the Caliper term.1EdTech pass-through
Caliper Analytics 1.2 profile vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
GeneralProfileGeneral Caliper profile used for events that do not fit a narrower profile in this projection.Use when the sender supplies GeneralProfile, or when profile inference from event type selects GeneralProfile.Invalid when GeneralProfile conflicts with the event type or is spelled differently from the Caliper term.1EdTech pass-through
Caliper Analytics 1.2 profile vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference

caliper_action

80 documented values. Canonical dictionary anchor: caliper_action.

Caliper pass-through
ValueMeaningUse whenInvalid whenSourceTrace
AbandonedThe actor abandoned the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Abandoned.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Abandoned.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
AcceptedThe actor accepted the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Accepted.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Accepted.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ActivatedThe actor activated the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Activated.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Activated.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
AddedThe actor added the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Added.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Added.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ArchivedThe actor archived the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Archived.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Archived.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
AttachedThe actor attached the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Attached.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Attached.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
BookmarkedThe actor bookmarked the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Bookmarked.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Bookmarked.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ChangedResolutionThe actor changed resolution the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly ChangedResolution.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of ChangedResolution.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ChangedSizeThe actor changed size the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly ChangedSize.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of ChangedSize.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ChangedSpeedThe actor changed speed the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly ChangedSpeed.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of ChangedSpeed.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ChangedVolumeThe actor changed volume the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly ChangedVolume.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of ChangedVolume.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ClassifiedThe actor classified the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Classified.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Classified.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ClosedPopoutThe actor closed popout the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly ClosedPopout.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of ClosedPopout.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
CommentedThe actor added a comment.Use when the event action property is exactly Commented.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Commented.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
CompletedThe actor completed the object, session, assessment, item, or activity.Use when the event action property is exactly Completed.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Completed.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
CopiedThe actor copied the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Copied.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Copied.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
CreatedThe actor created a resource, entity, or record.Use when the event action property is exactly Created.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Created.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
DeactivatedThe actor deactivated the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Deactivated.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Deactivated.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
DeclinedThe actor declined the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Declined.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Declined.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
DeletedThe actor deleted or requested deletion of a resource, entity, or record.Use when the event action property is exactly Deleted.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Deleted.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
DescribedThe actor described the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Described.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Described.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
DisabledClosedCaptioningThe actor disabled closed captioning the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly DisabledClosedCaptioning.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of DisabledClosedCaptioning.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
DislikedThe actor disliked the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Disliked.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Disliked.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
DownloadedThe actor downloaded the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Downloaded.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Downloaded.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
EnabledClosedCaptioningThe actor enabled closed captioning the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly EnabledClosedCaptioning.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of EnabledClosedCaptioning.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
EndedThe actor ended the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Ended.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Ended.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
EnteredFullScreenThe actor entered full screen the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly EnteredFullScreen.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of EnteredFullScreen.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ExitedFullScreenThe actor exited full screen the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly ExitedFullScreen.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of ExitedFullScreen.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ForwardedToThe actor forwarded to the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly ForwardedTo.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of ForwardedTo.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
GradedThe actor graded work, a result, or an assessment object.Use when the event action property is exactly Graded.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Graded.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
HidThe actor hid the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Hid.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Hid.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
HighlightedThe actor highlighted the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Highlighted.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Highlighted.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
IdentifiedThe actor identified the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Identified.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Identified.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
JumpedToThe actor jumped to the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly JumpedTo.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of JumpedTo.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
LaunchedThe actor launched a tool, application, resource, or LTI link.Use when the event action property is exactly Launched.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Launched.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
LikedThe actor liked the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Liked.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Liked.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
LinkedThe actor linked the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Linked.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Linked.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
LoggedInThe actor started an authenticated session.Use when the event action property is exactly LoggedIn.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of LoggedIn.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
LoggedOutThe actor ended an authenticated session.Use when the event action property is exactly LoggedOut.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of LoggedOut.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
MarkedAsReadThe actor marked as read the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly MarkedAsRead.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of MarkedAsRead.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
MarkedAsUnreadThe actor marked as unread the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly MarkedAsUnread.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of MarkedAsUnread.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ModifiedThe actor modified an existing resource, entity, or record.Use when the event action property is exactly Modified.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Modified.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
MutedThe actor muted the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Muted.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Muted.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
NavigatedToThe actor navigated to a target resource or location.Use when the event action property is exactly NavigatedTo.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of NavigatedTo.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
OpenedPopoutThe actor opened popout the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly OpenedPopout.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of OpenedPopout.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
OptedInThe actor opted in the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly OptedIn.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of OptedIn.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
OptedOutThe actor opted out the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly OptedOut.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of OptedOut.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
PausedThe actor paused the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Paused.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Paused.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
PostedThe actor posted a message, comment, or discussion item.Use when the event action property is exactly Posted.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Posted.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
PrintedThe actor printed the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Printed.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Printed.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
PublishedThe actor published the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Published.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Published.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
QuestionedThe actor questioned the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Questioned.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Questioned.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
RankedThe actor ranked the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Ranked.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Ranked.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
RecommendedThe actor recommended the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Recommended.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Recommended.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
RemovedThe actor removed the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Removed.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Removed.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ResetThe actor reset the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Reset.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Reset.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
RestartedThe actor restarted the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Restarted.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Restarted.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
RestoredThe actor restored the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Restored.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Restored.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ResumedThe actor resumed the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Resumed.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Resumed.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
RetrievedThe actor retrieved the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Retrieved.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Retrieved.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ReturnedThe actor returned the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Returned.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Returned.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ReviewedThe actor reviewed the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Reviewed.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Reviewed.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
RewoundThe actor rewound the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Rewound.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Rewound.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
SavedThe actor saved the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Saved.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Saved.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
SearchedThe actor issued a search query.Use when the event action property is exactly Searched.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Searched.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
SentThe actor sent the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Sent.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Sent.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
SharedThe actor shared the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Shared.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Shared.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ShowedThe actor showed the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Showed.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Showed.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
SkippedThe actor skipped the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Skipped.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Skipped.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
StartedThe actor started the object, session, assessment, media, or activity.Use when the event action property is exactly Started.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Started.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
SubmittedThe actor submitted work, answers, responses, or another generated object.Use when the event action property is exactly Submitted.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Submitted.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
SubscribedThe actor subscribed the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Subscribed.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Subscribed.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
TaggedThe actor tagged the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Tagged.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Tagged.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
TimedOutThe actor timed out the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly TimedOut.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of TimedOut.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
UnmutedThe actor unmuted the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Unmuted.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Unmuted.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
UnpublishedThe actor unpublished the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Unpublished.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Unpublished.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
UnsubscribedThe actor unsubscribed the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Unsubscribed.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Unsubscribed.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
UploadedThe actor uploaded the event object, generated result, media control, resource, or target named by the Caliper event.Use when the event action property is exactly Uploaded.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Uploaded.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
UsedThe actor used a tool, application, feature, or resource.Use when the event action property is exactly Used.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Used.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ViewedThe actor viewed a resource, item, page, message, or result.Use when the event action property is exactly Viewed.Invalid when the sender emits a synonym, lowercase form, or product-local action instead of Viewed.1EdTech pass-through
Caliper Analytics 1.2 action vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference

caliper_entity_type

69 documented values. Canonical dictionary anchor: caliper_entity_type.

Caliper pass-through
ValueMeaningUse whenInvalid whenSourceTrace
AgentA Caliper entity class for agent objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly Agent.Invalid when the type is an event class, a product-local class, or a misspelled form of Agent.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
AggregateMeasureA Caliper entity class for aggregate measure objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly AggregateMeasure.Invalid when the type is an event class, a product-local class, or a misspelled form of AggregateMeasure.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
AggregateMeasureCollectionA Caliper entity class for aggregate measure collection objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly AggregateMeasureCollection.Invalid when the type is an event class, a product-local class, or a misspelled form of AggregateMeasureCollection.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
AnnotationA Caliper entity class for annotation objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly Annotation.Invalid when the type is an event class, a product-local class, or a misspelled form of Annotation.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
AssessmentA test, quiz, assessment, or assessment package.Use when the entity object's Caliper type is exactly Assessment.Invalid when the type is an event class, a product-local class, or a misspelled form of Assessment.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
AssessmentItemA question or item inside an assessment.Use when the entity object's Caliper type is exactly AssessmentItem.Invalid when the type is an event class, a product-local class, or a misspelled form of AssessmentItem.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
AssignableDigitalResourceA Caliper entity class for assignable digital resource objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly AssignableDigitalResource.Invalid when the type is an event class, a product-local class, or a misspelled form of AssignableDigitalResource.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
AttemptA learner attempt or work attempt generated by an event.Use when the entity object's Caliper type is exactly Attempt.Invalid when the type is an event class, a product-local class, or a misspelled form of Attempt.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
AudioObjectAn audio media object.Use when the entity object's Caliper type is exactly AudioObject.Invalid when the type is an event class, a product-local class, or a misspelled form of AudioObject.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
BookmarkAnnotationA Caliper entity class for bookmark annotation objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly BookmarkAnnotation.Invalid when the type is an event class, a product-local class, or a misspelled form of BookmarkAnnotation.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ChapterA Caliper entity class for chapter objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly Chapter.Invalid when the type is an event class, a product-local class, or a misspelled form of Chapter.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
CollectionA Caliper entity class for collection objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly Collection.Invalid when the type is an event class, a product-local class, or a misspelled form of Collection.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
CommentA Caliper entity class for comment objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly Comment.Invalid when the type is an event class, a product-local class, or a misspelled form of Comment.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
CourseOfferingA course offering that can contain one or more sections.Use when the entity object's Caliper type is exactly CourseOffering.Invalid when the type is an event class, a product-local class, or a misspelled form of CourseOffering.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
CourseSectionAn instructional section or class instance used to group activity.Use when the entity object's Caliper type is exactly CourseSection.Invalid when the type is an event class, a product-local class, or a misspelled form of CourseSection.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
DateTimeQuestionA Caliper entity class for date time question objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly DateTimeQuestion.Invalid when the type is an event class, a product-local class, or a misspelled form of DateTimeQuestion.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
DateTimeResponseA Caliper entity class for date time response objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly DateTimeResponse.Invalid when the type is an event class, a product-local class, or a misspelled form of DateTimeResponse.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
DigitalResourceA digital learning resource.Use when the entity object's Caliper type is exactly DigitalResource.Invalid when the type is an event class, a product-local class, or a misspelled form of DigitalResource.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
DigitalResourceCollectionA collection of digital resources.Use when the entity object's Caliper type is exactly DigitalResourceCollection.Invalid when the type is an event class, a product-local class, or a misspelled form of DigitalResourceCollection.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
DocumentA Caliper entity class for document objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly Document.Invalid when the type is an event class, a product-local class, or a misspelled form of Document.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
FillinBlankResponseA Caliper entity class for fillin blank response objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly FillinBlankResponse.Invalid when the type is an event class, a product-local class, or a misspelled form of FillinBlankResponse.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ForumA forum or discussion container.Use when the entity object's Caliper type is exactly Forum.Invalid when the type is an event class, a product-local class, or a misspelled form of Forum.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
FrameA Caliper entity class for frame objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly Frame.Invalid when the type is an event class, a product-local class, or a misspelled form of Frame.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
GroupA group or collection of people, courses, or resources.Use when the entity object's Caliper type is exactly Group.Invalid when the type is an event class, a product-local class, or a misspelled form of Group.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
HighlightAnnotationA Caliper entity class for highlight annotation objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly HighlightAnnotation.Invalid when the type is an event class, a product-local class, or a misspelled form of HighlightAnnotation.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ImageObjectAn image media object.Use when the entity object's Caliper type is exactly ImageObject.Invalid when the type is an event class, a product-local class, or a misspelled form of ImageObject.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
LearningObjectiveA Caliper entity class for learning objective objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly LearningObjective.Invalid when the type is an event class, a product-local class, or a misspelled form of LearningObjective.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
LikertScaleA Caliper entity class for likert scale objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly LikertScale.Invalid when the type is an event class, a product-local class, or a misspelled form of LikertScale.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
LinkA Caliper entity class for link objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly Link.Invalid when the type is an event class, a product-local class, or a misspelled form of Link.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
LtiLinkAn LTI launch link or placement.Use when the entity object's Caliper type is exactly LtiLink.Invalid when the type is an event class, a product-local class, or a misspelled form of LtiLink.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
LtiSessionAn LTI-related session entity.Use when the entity object's Caliper type is exactly LtiSession.Invalid when the type is an event class, a product-local class, or a misspelled form of LtiSession.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
MediaLocationA Caliper entity class for media location objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly MediaLocation.Invalid when the type is an event class, a product-local class, or a misspelled form of MediaLocation.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
MediaObjectA media resource such as a video, audio, or image object.Use when the entity object's Caliper type is exactly MediaObject.Invalid when the type is an event class, a product-local class, or a misspelled form of MediaObject.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
MembershipA role or membership relationship between a person and a group.Use when the entity object's Caliper type is exactly Membership.Invalid when the type is an event class, a product-local class, or a misspelled form of Membership.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
MessageA forum or messaging object.Use when the entity object's Caliper type is exactly Message.Invalid when the type is an event class, a product-local class, or a misspelled form of Message.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
MultipleChoiceResponseA Caliper entity class for multiple choice response objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly MultipleChoiceResponse.Invalid when the type is an event class, a product-local class, or a misspelled form of MultipleChoiceResponse.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
MultipleResponseResponseA Caliper entity class for multiple response response objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly MultipleResponseResponse.Invalid when the type is an event class, a product-local class, or a misspelled form of MultipleResponseResponse.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
MultiselectQuestionA Caliper entity class for multiselect question objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly MultiselectQuestion.Invalid when the type is an event class, a product-local class, or a misspelled form of MultiselectQuestion.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
MultiselectResponseA Caliper entity class for multiselect response objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly MultiselectResponse.Invalid when the type is an event class, a product-local class, or a misspelled form of MultiselectResponse.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
MultiselectScaleA Caliper entity class for multiselect scale objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly MultiselectScale.Invalid when the type is an event class, a product-local class, or a misspelled form of MultiselectScale.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
NumericScaleA Caliper entity class for numeric scale objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly NumericScale.Invalid when the type is an event class, a product-local class, or a misspelled form of NumericScale.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
OpenEndedQuestionA Caliper entity class for open ended question objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly OpenEndedQuestion.Invalid when the type is an event class, a product-local class, or a misspelled form of OpenEndedQuestion.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
OpenEndedResponseA Caliper entity class for open ended response objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly OpenEndedResponse.Invalid when the type is an event class, a product-local class, or a misspelled form of OpenEndedResponse.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
OrganizationAn organization such as a school, district, department, or provider.Use when the entity object's Caliper type is exactly Organization.Invalid when the type is an event class, a product-local class, or a misspelled form of Organization.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
PageA Caliper entity class for page objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly Page.Invalid when the type is an event class, a product-local class, or a misspelled form of Page.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
PersonA learner, teacher, parent, or other human actor. Treat names and identifiers as sensitive learner or roster data.Use when the entity object's Caliper type is exactly Person.Invalid when the type is an event class, a product-local class, or a misspelled form of Person.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
QueryA search query or query entity.Use when the entity object's Caliper type is exactly Query.Invalid when the type is an event class, a product-local class, or a misspelled form of Query.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
QuestionA Caliper entity class for question objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly Question.Invalid when the type is an event class, a product-local class, or a misspelled form of Question.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
QuestionnaireA questionnaire or survey instrument.Use when the entity object's Caliper type is exactly Questionnaire.Invalid when the type is an event class, a product-local class, or a misspelled form of Questionnaire.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
QuestionnaireItemAn item within a questionnaire or survey.Use when the entity object's Caliper type is exactly QuestionnaireItem.Invalid when the type is an event class, a product-local class, or a misspelled form of QuestionnaireItem.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
RatingA Caliper entity class for rating objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly Rating.Invalid when the type is an event class, a product-local class, or a misspelled form of Rating.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
RatingScaleQuestionA Caliper entity class for rating scale question objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly RatingScaleQuestion.Invalid when the type is an event class, a product-local class, or a misspelled form of RatingScaleQuestion.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
RatingScaleResponseA Caliper entity class for rating scale response objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly RatingScaleResponse.Invalid when the type is an event class, a product-local class, or a misspelled form of RatingScaleResponse.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ResponseA learner response object generated by an interaction.Use when the entity object's Caliper type is exactly Response.Invalid when the type is an event class, a product-local class, or a misspelled form of Response.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ResultA score, result, or graded output generated by assessment or grading activity.Use when the entity object's Caliper type is exactly Result.Invalid when the type is an event class, a product-local class, or a misspelled form of Result.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ScaleA Caliper entity class for scale objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly Scale.Invalid when the type is an event class, a product-local class, or a misspelled form of Scale.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ScoreA numeric or categorical score entity.Use when the entity object's Caliper type is exactly Score.Invalid when the type is an event class, a product-local class, or a misspelled form of Score.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
SearchResponseA search response entity generated by a search event.Use when the entity object's Caliper type is exactly SearchResponse.Invalid when the type is an event class, a product-local class, or a misspelled form of SearchResponse.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
SelectTextResponseA Caliper entity class for select text response objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly SelectTextResponse.Invalid when the type is an event class, a product-local class, or a misspelled form of SelectTextResponse.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
SessionA session entity used to correlate a learner's or tool's activity.Use when the entity object's Caliper type is exactly Session.Invalid when the type is an event class, a product-local class, or a misspelled form of Session.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
SharedAnnotationA Caliper entity class for shared annotation objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly SharedAnnotation.Invalid when the type is an event class, a product-local class, or a misspelled form of SharedAnnotation.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
SoftwareApplicationA software tool, learning app, platform, or sensor-side application.Use when the entity object's Caliper type is exactly SoftwareApplication.Invalid when the type is an event class, a product-local class, or a misspelled form of SoftwareApplication.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
SurveyA survey instrument.Use when the entity object's Caliper type is exactly Survey.Invalid when the type is an event class, a product-local class, or a misspelled form of Survey.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
SurveyInvitationAn invitation to participate in a survey.Use when the entity object's Caliper type is exactly SurveyInvitation.Invalid when the type is an event class, a product-local class, or a misspelled form of SurveyInvitation.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
TagAnnotationA Caliper entity class for tag annotation objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly TagAnnotation.Invalid when the type is an event class, a product-local class, or a misspelled form of TagAnnotation.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
ThreadA discussion thread.Use when the entity object's Caliper type is exactly Thread.Invalid when the type is an event class, a product-local class, or a misspelled form of Thread.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
TrueFalseResponseA Caliper entity class for true false response objects. Preserve the sender's class name exactly.Use when the entity object's Caliper type is exactly TrueFalseResponse.Invalid when the type is an event class, a product-local class, or a misspelled form of TrueFalseResponse.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
VideoObjectA video media object.Use when the entity object's Caliper type is exactly VideoObject.Invalid when the type is an event class, a product-local class, or a misspelled form of VideoObject.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference
WebPageA web page resource.Use when the entity object's Caliper type is exactly WebPage.Invalid when the type is an event class, a product-local class, or a misspelled form of WebPage.1EdTech pass-through
Caliper Analytics 1.2 entity-class vocabulary from the generated term index.
citd-001-source-authority-term-index, citd-005-vocabulary-validation-profile-inference

conformance_result

3 documented values. Canonical dictionary anchor: conformance_result.

Caliper pass-through
ValueMeaningUse whenInvalid whenSourceTrace
passThe local gate completed and met the documented expectations.Use for successful documentation, implementation, demo/prod, or conformance checks.Invalid for official 1EdTech certification unless external certification evidence is linked separately.Platform gap fill
Conformance evidence state is local platform release evidence, not an official certification claim.
citd-014-conformance-release-evidence
failThe local gate ran and found a blocking defect.Use when evidence identifies a concrete failed assertion or reviewer category.Invalid when the run could not execute at all.Platform gap fill
Conformance evidence state is local platform release evidence, not an official certification claim.
citd-014-conformance-release-evidence
warningThe local gate completed with non-blocking risk or incomplete optional evidence.Use only when release policy permits a non-blocking warning.Invalid for a hard blocker that should be fail.Platform gap fill
Conformance evidence state is local platform release evidence, not an official certification claim.
citd-014-conformance-release-evidence
Public Cuts

What Alpha intentionally does not expose

These rows remain in the approved Caliper 1EdTech surface, the approved Ed-Fi 1EdTech surface, or internal release evidence. They are cut from public Alpha because they leak transport internals, duplicate guards, raw payloads, sensitive narratives, draft records, or conformance machinery that teachers and app-builder LLMs should not depend on.

Cut sourceWhy Alpha cuts itTrace
caliper.envelope.raw_envelopeRaw transport payload is preserved upstream but cut from public Alpha.EAITD-008
caliper.envelope.canonical_envelopeCanonical hash input is internal evidence, not customer vocabulary.EAITD-008
caliper.envelope.envelope_hashDuplicate guard remains internal; Alpha exposes idempotent behavior, not hash internals.EAITD-005
caliper.event.raw_eventRaw event payload is preserved upstream but not returned by GET /events.EAITD-008
caliper.event.canonical_eventCanonical event evidence is internal and must not become a public payload.EAITD-008
caliper.event.event_hashDuplicate guard remains internal; sourceEventId and behavior are public.EAITD-005
caliper.entity.raw_entityRaw entity projections can contain PII and are cut from public eventThing.EAITD-010
caliper.entity.canonical_entityCanonical entity evidence is internal.EAITD-008
caliper.conformance_run.*Release evidence exists upstream, but Alpha exposes docs/QC links, not conformance mutation APIs.EAITD-110
edfi.edfi_draft_record.*Draft and pre-ack records are UI/import recovery state, not real attendance or discipline moments.EAITD-016
edfi.canonical_record.payload_jsonRaw Ed-Fi payloads can contain sensitive administrative PII; Alpha exposes typed, redacted view columns instead.EAITD-016
edfi.canonical_record.etag / ack_idEd-Fi write concurrency and acknowledgement evidence belongs to the Ed-Fi base write surface, not Events Alpha read objects.EAITD-016
discipline narrative text in public examplesDiscipline descriptions are sensitive and must be redacted unless the caller is explicitly authorized.EAITD-111
Alias Map

Alpha names to Caliper source truth

Renames are aliases over the same database, not new storage. Caliper-backed event reads are views over Caliper base tables; Ed-Fi-backed attendance and discipline reads are views over Ed-Fi canonical records and descriptor resolution. Extensions name their source fields and ITD. This table is copied from the generated architecture/data-dictionary artifacts.

Alpha nameChange1EdTech sourceNotesTrace
activitySourcerename + restrictcaliper.sensorThe app or service allowed to send activity. Public Alpha never exposes secret values.EAITD-004
activitySource.idrenamecaliper.sensor.sensor_idStable platform row id for the source.EAITD-004
activitySource.sourceIrirenamecaliper.sensor.sensor_iriCaliper Sensor IRI retained for provenance.EAITD-004
activitySource.namerenamecaliper.sensor.display_namePlain label shown in teacher and app-builder workflows.EAITD-004
activitySource.statusrestrictcaliper.sensor.statusactive, paused, retired.EAITD-004
eventBatchrename + cut public detailcaliper.envelopeTransport package used for ingest evidence; raw batch details are not a public Alpha resource.EAITD-005
eventBatch.sentAtrenamecaliper.envelope.send_timeWhen the source says it sent the batch.EAITD-005
eventBatch.receivedAtrenamecaliper.envelope.received_atWhen TimeBack received the batch.EAITD-005
eventBatch.statusrename + restrictcaliper.envelope.envelope_statusreceived, processed, rejected, duplicate.EAITD-005
eventrenamecaliper.eventOne immutable moment in the activity stream.EAITD-001
event.idrenamecaliper.event.event_row_idPlatform identifier for the normalized event row.EAITD-002
event.sourceEventIdrenamecaliper.event.event_iriSource-provided stable id, generated as a Caliper event IRI when Alpha accepts a plain event.EAITD-005
event.eventTyperenamecaliper.event.event_typeCaliper Event subclass preserved for provenance.EAITD-002
event.profilerenamecaliper.event.profileCaliper profile retained for advanced provenance and mapping.EAITD-002
event.actionrenamecaliper.event.actionTyped Caliper action, not parsed prose.EAITD-002
event.kindextendalpha.event_extension.event_kindPlain governed event kind used by Alpha filters. Derivation inputs: caliper.event.event_type, caliper.event.action, caliper.event.profile, and alpha.policy.events.kind_map.EAITD-007
event.actorRefrenamecaliper.event.actorOriginal Caliper actor reference or object.EAITD-002
event.studentIdextendalpha.event_extension.student_sourced_idReal relationship link when actor resolves to a known student. Derivation inputs: caliper.event.actor, caliper.event_entity_link, and People & Orgs user.EAITD-006
event.objectRefrenamecaliper.event.objectThing acted on, preserved from Caliper.EAITD-002
event.contentIdextendalpha.event_extension.content_idReal relationship link when the object/target resolves to platform Content. Derivation inputs: caliper.event.object, caliper.event.target, caliper.event_entity_link, and Content item.EAITD-006
event.appRefrenamecaliper.event.ed_appApp named inside the event.EAITD-002
event.activitySourceIdrenamecaliper.envelope.sensor_idRegistered source that delivered the event.EAITD-004
event.groupRefrenamecaliper.event.group_entityGroup or cohort context from Caliper.EAITD-002
event.orgIdextendalpha.event_extension.org_sourced_idReal relationship link when group context resolves to a known organization. Derivation inputs: caliper.event.group_entity, caliper.event_entity_link, and People & Orgs org.EAITD-006
event.generatedRefrename + restrictcaliper.event.generatedMay link to generated output, including a result reference, but does not expose the result record.EAITD-003
event.targetRefrenamecaliper.event.targetTarget entity for navigation, launch, or move actions.EAITD-002
event.referrerRefrenamecaliper.event.referrerReferring resource for navigation or reading activity.EAITD-002
event.sessionRefrenamecaliper.event.federated_sessionSession correlation reference.EAITD-002
event.happenedAtrenamecaliper.event.event_timePoint-in-time date used for roster and org lookups.EAITD-002
event.receivedAtrenamecaliper.envelope.received_atReceipt timestamp from the event batch.EAITD-005
event.extensionsrestrictcaliper.event.event_extensionsOnly governed, non-secret, redacted extension keys are surfaced in Alpha.EAITD-010
event.rawPayloadcutcaliper.event.raw_eventRaw Caliper payload is preserved internally but not a public Alpha field.EAITD-008
eventThingrenamecaliper.entityA person, app, group, resource, session, attempt, or result object named inside an event.EAITD-002
eventThing.idrenamecaliper.entity.entity_row_idPlatform id for the current entity projection.EAITD-002
eventThing.sourceIdrenamecaliper.entity.entity_iriOriginal Caliper entity IRI.EAITD-002
eventThing.typerenamecaliper.entity.entity_typeCaliper entity class preserved for provenance.EAITD-002
eventThing.namerename + restrictcaliper.entity.nameDisplay label only when auth and redaction allow it.EAITD-010
eventLinkrenamecaliper.event_entity_linkTyped relationship from an event to a named eventThing.EAITD-006
eventLink.rolerenamecaliper.event_entity_link.relationactor, object, generated, target, edApp, group, membership, referrer, federatedSession, member, or item.EAITD-006
eventLink.orderrenamecaliper.event_entity_link.ordinalSibling order when a relation is an array.EAITD-006
eventLink.rawPathrename + restrictcaliper.event_entity_link.raw_pathAdvanced provenance path; not a user-facing label.EAITD-006
trustEvidencecut public / summary onlycaliper.conformance_runRelease evidence remains queryable internally; public Alpha gets only trust summary links in docs/QC, not a mutation API.EAITD-008
attendanceEventrename + restrictedfi.canonical_record where record_kind in (StudentSchoolAttendanceEvent, StudentSectionAttendanceEvent)A school-day or class-section attendance occurrence. It is sourced from Ed-Fi canonical records and surfaced as an Alpha Events object because it happened.EAITD-014
attendanceEvent.idrenameedfi.canonical_record.edfi_local_idPlatform-minted Ed-Fi row id, not a OneRoster sourcedId.EAITD-014
attendanceEvent.sourceRecordKindrename + restrictedfi.canonical_record.record_kindStudentSchoolAttendanceEvent or StudentSectionAttendanceEvent only.EAITD-014
attendanceEvent.studentIdrenameedfi.canonical_record.student_sourced_idOneRoster user.sourcedId resolved by the Ed-Fi GAP-A1 roster boundary.EAITD-014
attendanceEvent.schoolIdrenameedfi.canonical_record.school_sourced_idOneRoster org.sourcedId for school attendance records.EAITD-014
attendanceEvent.classIdrenameedfi.canonical_record.class_sourced_idOneRoster class.sourcedId for section attendance records.EAITD-014
attendanceEvent.eventDaterenameedfi.canonical_record.payload_json.AttendanceEvent.EventDateDate the attendance occurrence happened; used for point-in-time roster joins.EAITD-014
attendanceEvent.categoryrename + restrictedfi.canonical_record.payload_json.AttendanceEvent.AttendanceEventCategoryDescriptor + edfi.descriptor_codeGoverned AttendanceEventCategory descriptor resolved through Ed-Fi descriptor codes, not an open string.EAITD-014
attendanceEvent.arrivedAtrenameedfi.canonical_record.payload_json.ArrivalTimeOptional local arrival time.EAITD-014
attendanceEvent.departedAtrenameedfi.canonical_record.payload_json.DepartureTimeOptional local departure time.EAITD-014
attendanceEvent.durationMinutesrename + restrictedfi.canonical_record.payload_json.SchoolAttendanceDuration or payload_json.SectionAttendanceDurationOptional attendance duration in minutes; school and section source fields fold to one plain field.EAITD-014
attendanceEvent.isDeletedrename + restrictedfi.canonical_record.is_deletedOrdinary Alpha reads exclude true rows; audit reads must ask for deleted records explicitly.EAITD-016
disciplineEventrename + restrictedfi.canonical_record where record_kind in (DisciplineIncident, StudentDisciplineIncidentBehaviorAssociation)A discipline incident plus the student behavior association that makes it student-scoped.EAITD-015
disciplineEvent.idrenameedfi.canonical_record.edfi_local_idPlatform-minted Ed-Fi row id for the student-scoped discipline association or incident row.EAITD-015
disciplineEvent.incidentIdrenameedfi.canonical_record.source_key_json.IncidentIdentifierLocal Ed-Fi incident identifier preserved for provenance.EAITD-015
disciplineEvent.studentIdrenameedfi.canonical_record.student_sourced_idOneRoster user.sourcedId from StudentDisciplineIncidentBehaviorAssociation.EAITD-015
disciplineEvent.schoolIdrenameedfi.canonical_record.school_sourced_idOneRoster org.sourcedId from the DisciplineIncident school reference.EAITD-015
disciplineEvent.incidentDaterenameedfi.canonical_record.payload_json.IncidentDateDate the incident happened; used for point-in-time roster joins.EAITD-015
disciplineEvent.incidentTimerenameedfi.canonical_record.payload_json.IncidentTimeOptional local time of the incident.EAITD-015
disciplineEvent.behaviorrename + restrictedfi.canonical_record.payload_json.BehaviorDescriptor + edfi.descriptor_codeGoverned behavior descriptor from the student association, not free text.EAITD-015
disciplineEvent.participationCoderename + restrictedfi.canonical_record.payload_json.DisciplineIncidentParticipationCodes + edfi.descriptor_codeGoverned participation descriptor when present.EAITD-015
disciplineEvent.locationrename + restrictedfi.canonical_record.payload_json.IncidentLocationDescriptor + edfi.descriptor_codeGoverned incident-location descriptor when present.EAITD-015
disciplineEvent.descriptionrestrictedfi.canonical_record.payload_json.IncidentDescription or payload_json.BehaviorDetailedDescriptionRedacted summary only; raw narrative remains sensitive Ed-Fi payload data.EAITD-015
disciplineEvent.isDeletedrename + restrictedfi.canonical_record.is_deletedOrdinary Alpha reads exclude true rows; audit reads must ask for deleted records explicitly.EAITD-016
activitySource.createdAtrenamecaliper.sensor.created_atDocumented by EAITD-004 text as a safe public source field; omitted from the generated architecture alias-map JSON.EAITD-004
activitySource.updatedAtrenamecaliper.sensor.updated_atDocumented by EAITD-004 text as a safe public source field; omitted from the generated architecture alias-map JSON.EAITD-004
eventsPolicyextendalpha.policy.events.*Policy-owned configuration for event kind mapping, page-size bounds, and event-derived minutes rules.EAITD-007
Module Placement

Events owns moments, not the things around them

ModuleBelongs there ifEvents rule
People & OrgsStudents, staff, orgs, memberships, levels, brand, modality, campus, and point-in-time roster facts.Events stores typed links such as studentId or orgId only when a moment resolves to People & Orgs. The roster fact remains in People & Orgs.
CurriculumThe shared curriculum graph and academic standards.Events may be evidence that a curriculum skill was touched, usually through Content. Events does not own curriculum nodes or edges.
ContentArticles, videos, questions, tests, lessons, and other things a student touches.Events can reference contentId or objectRef. The blank instrument and content effectiveness rollup stay in Content.
EventsA record that something happened.Events owns immutable moments such as app opens, views, scrubs, hint requests, answers, launches, submissions, sessions, attendance events, and discipline incidents.
ResultsSettled statements about how one student is doing.Events can feed or point to Results. Score, mastery, MAP, working grade, report card, and student knowledge graph stay in Results.
Implementation Spec

The next deliverable must satisfy these contracts

Live base URL

Serve the API at https://platform3-andymontgomery-9773s-projects.vercel.app/events/alpha/implementation/api with demo token mint at /dev/mint?tenantId=demo.

PITD-011-HOSTED-DOCS-IDENTITY

Persistent storage

Persist through approved caliper.envelope, caliper.event, caliper.entity, caliper.event_entity_link, and caliper.sensor tables. No in-memory production state.

EAITD-001, EAITD-005

No event mutation

Do not add public PUT, PATCH, or DELETE routes for accepted events.

EAITD-101, EAITD-104

Typed filters

Implement the documented GET /events filters and cursor contract exactly; do not make consumers parse names, URLs, or raw payload.

EAITD-007, EAITD-103

Problem JSON

Return redacted typed Problems for every documented failure; include safe requestId and traceId.

EAITD-108, EAITD-010

Status semantics

Tests must prove 409 idempotency conflicts, 412 conditional precondition failures, and 422 validation Problems return the documented bodies and do not leak raw request values.

EAITD-104, EAITD-105, EAITD-108

Attendance and discipline reads

Implement GET /attendance-events, GET /attendance-events/{attendanceEventId}, GET /discipline-events, and GET /discipline-events/{disciplineEventId} as read-only views over Ed-Fi canonical records, with descriptor resolution and no Alpha copied tables.

EAITD-013, EAITD-014, EAITD-015, EAITD-016

Source-shaped ingest

Implement POST /source-imports so TimeBack and Horizons source rows are normalized server-side, return events:validation_failed as HTTP 400, return events:adapter_rejected as HTTP 422, and report HTTP 200 only after accepted rows are readable through public Events endpoints.

EAITD-005, EAITD-007, EAITD-008, EAITD-108

Endpoint-specific filters

Each list endpoint must accept only its documented query parameters plus cursor/pageSize; attendance and discipline filters must not appear on GET /events.

EAITD-103, EAITD-016

Privacy / retention

Tests must prove public reads are redacted, raw payloads remain non-public, and no public Events DELETE or age-based retention route ships unless architecture is rolled back first.

EAITD-010, EAITD-111

Boundary tests

Tests must prove score/mastery/gradebook/content-effectiveness fields never appear in Events responses and discipline sanctions/transcript effects never appear in disciplineEvent responses.

EAITD-003, EAITD-015

Provenance anchors

The build must fail if any customer-website data-dictionary fragment no longer exists in the approved Events Alpha data dictionary.

EAITD-011

Sources

Source trail and benchmark fit

This page was generated from the approved Events Alpha architecture and data dictionary, including the June 2026 raw-ingest re-gate, then shaped against Stripe's API reference pattern: top-level base URL, authentication, errors, endpoint schemas, cURL examples, response examples, and deep links.

Read
https://docs.stripe.com/api
https://docs.stripe.com/api/authentication
loop/context/benchmarks/customer_website.html (checked; not present in this checkout)
loop/events/evals/alpha/customer_website (checked; not present in this checkout)
loop/events/evals/alpha/data_dictionary/customer_eval.json
loop/events/evals/alpha/data_dictionary/rubric.json
loop/events/evals/alpha/data_dictionary/results/a1-customer.json
loop/events/evals/alpha/data_dictionary/results/a1-rubric.json
loop/events/artifacts/alpha/architecture/site/index.html
loop/events/artifacts/alpha/architecture/site/events-alpha-architecture-traceability.json
loop/events/artifacts/alpha/architecture/site/events-alpha-alias-map.json
loop/events/artifacts/alpha/architecture/summary.json
loop/events/artifacts/alpha/data_dictionary/site/index.html
loop/events/artifacts/alpha/data_dictionary/site/events-alpha-data-dictionary.json
loop/events/artifacts/alpha/data_dictionary/summary.json
loop/events/artifacts/alpha/data_dictionary/source/build-site.mjs
loop/ed_fi/artifacts/1edtech/architecture/site/index.html
loop/ed_fi/artifacts/1edtech/data_dictionary/site/index.html
loop/ed_fi/artifacts/1edtech/data_dictionary/site/data/edfi-udm-catalog.json
loop/platform/artifacts/1edtech/architecture/site/index.html
loop/platform/artifacts/1edtech/data_dictionary/site/index.html