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
exam.started — fires when a student begins a proctored exam session
exam.started — fires when a student begins a proctored exam session
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.exam.completed — fires when a student submits an exam
exam.completed — fires when a student submits an exam
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.violation.detected — fires when a critical proctoring violation is recorded
violation.detected — fires when a critical proctoring violation is recorded
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.
grading.done — fires when an AI-graded assessment is persisted
grading.done — fires when an AI-graded assessment is persisted
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.”user.provisioned — fires when a new institution user is created
user.provisioned — fires when a new institution user is created
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).user.deprovisioned — fires when an institution user is removed
user.deprovisioned — fires when an institution user is removed
via tells you the trigger:Pair with
user.provisioned to drive user lifecycle syncs in external
HRIS, CRM, or SIEM systems.subscription.updated — fires when the Stripe subscription status changes
subscription.updated — fires when the Stripe subscription status changes
active,
past_due, canceled, etc. planId may be null if the plan isn’t
recorded on our side.Delivering to multiple endpoints
If you subscribe two endpoints to the same event, each gets its own delivery row with a distinctid — they don’t share attempts or retry
state.