Skip to main content
Each delivery is a JSON object with a common envelope. The event-specific fields live under data.

Common envelope

IDs are opaque strings. The sample IDs below (usr_…, exm_…, ses_…) are illustrative — treat every ID as an opaque token and match it exactly. Do not parse, validate, or depend on any prefix or internal structure; the format can change without notice.
Partner API correlation. When an exam session was created through the Partner API — i.e. via POST /partner/v1/assignments, or by a student who signed in through your SSO — the exam.started, exam.completed, violation.detected, and grading.done events carry three extra data fields so you can correlate without a lookup:These fields are omitted (or null) for exam activity that didn’t originate from the Partner API.

Events

Fires once per new proctoring session, immediately after the session document is persisted. studentId may be null for guest / link-based exam modes. attempt is 1-indexed — the student’s nth attempt at this exam. Great for driving real-time attendance dashboards. The externalUserId / partnerAssignmentId / metadata fields appear only for Partner API sessions.
Fires once per submission, after the session is scored. studentId may be null for guest / link-based exam modes. The score here is the auto-marked portion; for exams that require manual or AI marking the final result arrives later via grading.done. The externalUserId / partnerAssignmentId / metadata fields appear only for Partner API sessions.
Only critical violations fire this event. Warnings (e.g. one quick head turn) are too noisy to push to customer systems by default — they’re visible inside Quippy’s own dashboard but don’t emit.
Fields:
Fires once per new graded assessment across all grading entry points — `POST /api/grading/grade-open-ended`, `grade-pronunciation`, `grade-writing`, `cefr/speaking`, `ielts/speaking`, `ielts/writing`, `hskk/grade-speaking`, `dels-speaking/grade`, `dels-writing/grade`.score fields you’ll see depend on assessmentType:Unpopulated score fields are null — don’t key off their presence.
Teacher edits to an existing assessment (reviewing, overriding a score) do not re-fire grading.done. The event is strictly “first grade was persisted.”
Fires when a new user is added to the institution. The via field tells you how it happened:role is one of admin, manager, editor, member, viewer. accessLevel is the numeric equivalent (5 / 4 / 3 / 2 / 1).
Fires on soft-delete. via tells you the trigger:Pair with user.provisioned to drive user lifecycle syncs in external HRIS, CRM, or SIEM systems.
Fires when Stripe tells Quippy a subscription has changed — active, past_due, canceled, etc. planId may be null if the plan isn’t recorded on our side.
Fires exactly once when you click Send test on an endpoint’s detail page. Test deliveries are not retried on failure — they’re a one-shot check.

Delivering to multiple endpoints

If you subscribe two endpoints to the same event, each gets its own delivery row with a distinct id — they don’t share attempts or retry state.