Skip to main content
These endpoints require a submission that is already open (in_progress).The only flow that creates one is the Edpire-hosted share link, where the learner opens the assessment and a submission is started server-side before they begin answering.They therefore do not work with the headless REST submit (POST /assessments/{id}/submit creates and grades in a single call) or with the embedded SDK player (which does not expose a submission ID until after grading). Calling /save or /events from those integrations returns 404 submission_not_found every time.If you are building a custom player and need server-side autosave, contact us — this needs an endpoint to open a submission up front, which does not exist yet.

Autosave modes

Every assessment has an autosave setting (configurable by the teacher, with an org-level default): Read the mode from the assessment object (assessment.settings.autosave) before starting the session.

Autosaving answers

Body:
Response:
The answers shape is the same AssessmentAnswers object used in the submit endpoint — store it in state and pass it directly.

Implementation pattern

Draft rows are silently overwritten by the final submit — you do not need to delete them.

Recording interaction events

Stream learner interaction events to Edpire for analytics, reporting, and future proctoring features.
Event types: Example — track answer changes:
Response:

change_count in results

When you record answer_change events, Edpire atomically increments a change_count counter on the answer row. This counter is returned in GET /submissions/{id} under each question_results entry:
It is 0 when your integration does not record answer_change events. Use change_count to identify questions where learners second-guess themselves — a signal of low confidence regardless of whether the final answer is correct.

Implementation pattern

All event requests should go through your backend proxy (same as /check calls) so your API key is never exposed in the browser.