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. Edpire’s own player (the hosted take page and share links, and so the mobile app) saves and restores by these modes itself. With a time limit, the clock keeps running while the learner is away: it counts from when they first opened the attempt.

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.