Skip to main content
This reference applies to the Partner Events API at 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

Set object.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

Set object.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

Set object.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 grading SoftwareApplication. 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 to POST /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.

Processing boundaries

A grade or assessment event may validate and then be declined because its pinned course is missing or belongs to another application. A valid pinned course does not require an enrollment row to receive these events. Unpinned assignable and view events use enrollment context when available, which can be ambiguous when several courses match. Payload validation checks structure. It does not prove that timing is plausible, a mastery assertion is deserved, or the intended result has appeared. Verify those outcomes through the result and analytics APIs available to your integration.