POST /events/1.0. Send one event per request. An envelope is accepted only when data contains exactly one event. The API derives its transport envelope from the event; an outer sensor does not override edApp.
Shared fields
Use the IDs assigned to you through Timeback’s application, roster, and course APIs. In the examples,
api.example.com and all example IDs are placeholders. Substitute your API base URL and assigned IDs. A bare student ID does not satisfy the URL schema.
The event and many nested objects reject unknown fields. Place only documented extensions in each extension object. group.id is not a substitute for extensions.course.id in this contract.
Actions and results
AssessmentEvent does not accept Completed; use Submitted. A completed question is an AssessmentItemEvent. These lifecycle events do not award XP just because they were accepted. Use the agreed scoring contract.
AssessmentEvent
Setobject.type to Assessment and provide its ID and nonempty name. generated is an Attempt with an ID URL, student assignee, resource URL in assignable, and startedAtTime. Include endedAtTime for Submitted. count is optional; when present it is a positive integer. Keep assignable aligned with object.id.
The optional object.isPartOf is a DigitalResourceCollection. Include an explicit course even when the student has one enrollment.
AssessmentItemEvent
Setobject.type to AssessmentItem and include a nonempty name. object.isPartOf must identify the parent Assessment.
For Completed, generated must be a Response containing an Attempt. The attempt requires startedAtTime and endedAtTime. generated can be omitted for Started or Skipped. A response event does not encode correctness; send an agreed grade event for the score.
AssignableEvent
Setobject.type to AssignableDigitalResource. Include a nonempty name and mediaType. generated is an Attempt with startedAtTime for every action; Completed also requires endedAtTime. Pin extensions.course.id when a student can have multiple courses in the same app and subject.
ViewEvent
object.type may be DigitalResource, AssignableDigitalResource, Assessment, or AssessmentItem. Include a nonempty name. generated is an Attempt with both start and end timestamps. mediaType, a parent DigitalResourceCollection, and profile are optional.
GradeEvent
The actor is the gradingSoftwareApplication. The student is object.assignee; object is the Attempt. Its assignable is a DigitalResource object with an ID and nonempty mediaType. Include object.extensions.activityName and an explicit course.
generated is a Score with an ID URL, scoreGiven, maxScore, and extensions.scoreType.
Only send
MASTERY after your integration’s mastery decision. A low score with this type is still a mastery assertion under the current mapping. Set scoreType to match the meaning of the event.
SessionEvent
Use a stable session URL and retain the same session identity through login, heartbeats, and logout. A timeout also needs a student identity that the receiver can resolve from the event or session context; validate that path with your integration before relying on it.
Heartbeats
After a successful login event, send a heartbeat toPOST /events/1.0/sessions/{sessionId}/heartbeat with {"eventTime":"2026-09-11T15:01:00.000Z"}. The API also accepts POST /events/1.0/heartbeat with sessionId and eventTime in the body, or sessionId in the query string. Use the session identifier expected by your integration.
A successful heartbeat returns 200, status, sessionId, and endedAtTime. An unknown session returns 404. A successful login response prepares the session before queuing further processing, so a database error during that preparation returns a retryable 503.