All routes are prefixed with your API base (http://127.0.0.1:3001 by default). Grading /
blueprint for attempts uses Redis {prefix}:free-test:{MongoId}:…; progress queues use the same user keys as paid tests ({prefix}:attempt:user:…).
| Method | Path | Auth | Notes |
|---|---|---|---|
GET |
/api/public/free-tests |
None |
Directory (?limit/?skip). Each →
thumbnail_url, block_thumbnails[]; use returned
id with GET …/:id.
|
GET |
/api/public/free-tests/:id |
None | Public sheet; blocks[].thumbnail_url preserved (Mongo Redis); strips answer secrets. |
POST |
/api/public/free-tests/:id/start |
Bearer JWT | Handshake; returns duration, name, server_time. |
POST |
/api/public/free-tests/:id/progress/batch |
Bearer JWT | Autosave snapshots (every 25s in this demo after Begin). |
POST |
/api/public/free-tests/:id/attempt |
Bearer JWT | Mongo submit + score (BullMQ when enabled; uses free Redis namespace). |
GET |
/api/public/free-tests/:id/attempt/review |
Bearer JWT | Per-question correctness + correct answer text. |
Calls GET /api/public/free-tests (no JWT). Click a row to copy its id into the field
below and run step 1 · Load sheet.
Serve via Express static: http://127.0.0.1:3001/free-test.html. “Load sheet” hits the
public GET (no JWT). Authenticated endpoints need a Bearer token from /api/auth.
Resolved API: –