Skip to main content
This is the end-to-end flow. All calls are server-to-server with your API key.

1. List available tests

Only tests published to your institution are returned — we curate this set with you. resultVisibility tells you in advance which completion experience the student will get (see step 4). Paginate with ?limit= (1–100, default 20) and ?offset=.

2. Create an assignment

Response:
We match or create the Quippy user for your externalUserId automatically — no pre-provisioning needed.
Send an Idempotency-Key header (any unique string) so a retried request after a network blip returns the same assignment instead of creating a duplicate. Reusing a key with a different body returns 409.

3. Send the student in

Render startUrl as your “Start test” button. When the student clicks it, they’re signed in automatically and dropped directly onto the assigned test — no password, no separate Quippy login.
  • The link is valid until startUrlExpiresAt (default 7 days, never past dueAt). Fetch a fresh one any time from GET /assignments/{id}.
  • Re-opening it re-enters an in-progress attempt. It does not allow a retake after submission — create a new assignment for that.

4. The student finishes

The completion experience depends on the test’s resultVisibility: The return button sends them to your callbackUrl with correlation params appended:
Treat the return redirect as navigation only — users close tabs and links get replayed. Your source of truth for assignment state is webhooks and GET /assignments/{id}, never the redirect.

5. Receive results

Subscribe a webhook endpoint to get real-time updates. Every event for a Partner API assignment carries your externalUserId, partnerAssignmentId, and metadata echo — see the event catalog. No webhook receiver yet? Poll GET /assignments/{id} — it reports live status and, once available, the result.