Events

Know when work arrives, marks are approved, results are released and learners enrol.

Event types

EventWhen
submission.receivedA learner (or your app) submitted work.
submission.markedAn AI marking proposal is ready for review.
marking.approvedA person approved the marks.
results.releasedResults were released to learners.
enrolment.createdA learner was enrolled.
enrolment.completedA learner completed a course.
learner.createdA learner was added.
course.publishedA course was published.
certificate.issuedA certificate was issued.
attendance.checked_inSomeone checked in to a live session.
job.completedAn API job finished.

Two ways to receive them

Webhooks: choose the events for your endpoint in the console. Each delivery is signed exactly like job notices and carries ids only. See webhooks.

Polling: GET /v1/events?type=&since=&cursor= with the events:read scope returns the same events (all except job.completed, which you read with GET /v1/jobs) newest first, or oldest first with order=asc, so you can catch up after downtime. Events are kept for 30 days.

Verify a webhook
# EduMark POSTs JSON to your HTTPS endpoint with:
#   X-EduMark-Signature: t=1729503000,v1=5257a869e7ecebeda32affa62cdca3fa51cad7e77a0e56ff536d0ce8e108d8bd
#   X-EduMark-Event-Id:  wh_3f1c9a…   (deduplicate on this; delivery is at least once)
# The signature is HMAC-SHA256 of "<t>.<event id>.<raw body>" with your webhook secret.
# Answer 2xx within 5 seconds. Failed deliveries retry after 1 min, 5 min, 30 min, 2 h and 6 h.

Who sees which events

Events follow the same rules as EduMark. You get an event type only if the key’s creator (for a webhook, the person who saved it) can see it in EduMark, and submission and result events only for work that person can open, such as the submissions they are allocated to mark.

For anonymously marked assignments, submission events have learner_id: null and a candidate_ref until the result is released, exactly as GET /v1/submissions shows them. You can only subscribe a webhook to events you can see yourself.