AI Studies board: staff API
Read everything staff can see on the board (submissions in any state, the AI pre-review, students, their claims, applications and profiles) and record review decisions.
Auth. Every route except this document needs Authorization: Bearer <key>. Make a key on the board's Staff page (Staff accounts → API keys). A key acts as the staff member who made it, and reviews made with it are recorded under their email. read keys can read everything; write keys can also review.
Not here, on purpose: wipes and resets, password resets, staff accounts and résumé files. Those stay on the page.
Rate limit: 300 requests a minute per key.
Try it
curl -H "Authorization: Bearer $AI_STUDIES_KEY" https://ai-7cb616da6b4d4036a5fe5a7dcd8f3266.ecs.us-east-1.on.aws/api/v1/me
Machine-readable: /api/v1/openapi.json
GET /api/v1/me
Who this key acts as
Responses
200The key's owner and scope401No key, or a revoked one
GET /api/v1/submissions
List submissions
Compact rows: no long details text and no individual findings. Newest first.
| Parameter | In | Values | |
|---|---|---|---|
state | query | queue | all | pending | approved | changes_requested | rejected |
|
owner | query | student | submitter |
|
source | query | faculty | lab | industry | student | |
course | query | string | Roster course of the student owner, e.g. |
q | query | string | Matches title, owner name, owner email or organisation. |
has_repo_link | query | true | false |
Responses
200Matching submissions400Unknown state
GET /api/v1/submissions/{id}
One submission, in full
Every part with its full text, who holds each part, the review decision, the AI pre-review with all its findings, and the links found in the text.
| Parameter | In | Values | |
|---|---|---|---|
id | path | integer |
Responses
200The submission404No such submission
GET /api/v1/students
List or search the roster
| Parameter | In | Values | |
|---|---|---|---|
q | query | string | Part of a name or email. |
course | query | string | |
section | query | string |
Responses
200Students
GET /api/v1/students/{email}
One student, with everything they submitted
Profile, résumé metadata (not the file), active claims, applications with their statements, and every proposal of their own in full, AI pre-review included.
| Parameter | In | Values | |
|---|---|---|---|
email | path | string |
Responses
200The student404Not on the roster
POST /api/v1/submissions/{id}/review
Record a review decision (write key)
The same decision as the review queue's buttons. Approving a student's own proposal assigns it to them. A note is required for anything but approval, and is what the submitter reads.
| Parameter | In | Values | |
|---|---|---|---|
id | path | integer |
Body
{"verdict":"approved | changes_requested | rejected","note":"string"}Responses
200Recorded400bad_verdict or note_required403read_only_key404No such submission409has_active_claim: it is live and a student holds it
POST /api/v1/submissions/{id}/semester-project
Mark or unmark a student's proposal as their graded project (write key)
Re-runs the AI pre-review afterwards, because the answer changes which bar it applies.
| Parameter | In | Values | |
|---|---|---|---|
id | path | integer |
Body
{"semester_project":"boolean"}Responses
200Set400not_student403read_only_key404No such submission
POST /api/v1/submissions/{id}/prereview
Run the AI pre-review again (write key)
Never approves anything when run this way. Waits for the reviewer, up to two minutes.
| Parameter | In | Values | |
|---|---|---|---|
id | path | integer |
Responses
200Done, or the reviewer was unavailable (ok false, reason reviewer_unavailable)403read_only_key404No such submission