assessment
Assessment
Exams, recorded results, and progress reports.
15 endpoints
DELETE /api/v1/exams/{id}
Delete an exam. Only allowed when it has no results yet (409 otherwise).
Path & query parameters
| Name | In | Type | Constraints |
|---|---|---|---|
idrequired | path | string | — |
curl example
curl -X DELETE "https://api.yourdomain.com/api/v1/exams/37386ae0-3738-7738-8386-37386ae03738" \
-H "Authorization: Bearer $INSTITFLOW_API_KEY"Responses
| Name | Type | Constraints |
|---|---|---|
okrequired | enum: true | — |
{
"ok": true
}Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Path & query parameters
| Name | In | Type | Constraints |
|---|---|---|---|
idrequired | path | string | — |
Request body
| Name | Type | Constraints |
|---|---|---|
title | string | 1–200 chars |
kind | enum: "quiz" | "exam" | "homework" | "project" | "final" | — |
maxScore | number | ≥0 |
weight | number | ≥0 · default: 1 |
heldAt | string | string (date) | — |
Example
{
"title": "Midterm Exam",
"kind": "quiz",
"maxScore": 0,
"weight": 1,
"heldAt": "string"
}curl example
curl -X PATCH "https://api.yourdomain.com/api/v1/exams/37386ae0-3738-7738-8386-37386ae03738" \
-H "Authorization: Bearer $INSTITFLOW_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"title": "Midterm Exam",
"kind": "quiz",
"maxScore": 0,
"weight": 1,
"heldAt": "string"
}'Responses
| Name | Type | Constraints |
|---|---|---|
idrequired | string (uuid) | — |
groupIdrequired | string (uuid) | — |
titlerequired | string | — |
kindrequired | enum: "quiz" | "exam" | "homework" | "project" | "final" | — |
maxScorerequired | number | — |
weightrequired | number | — |
heldAtrequired | string (date) | null | — |
publishedAtrequired | string (date-time) | null | — |
createdAtrequired | string (date-time) | — |
updatedAtrequired | string (date-time) | — |
{
"id": "37386ae0-3738-7738-8386-37386ae03738",
"groupId": "6dc7fce6-6dc7-7dc7-8c7f-6dc7fce66dc7",
"title": "Midterm Exam",
"kind": "quiz",
"maxScore": 1,
"weight": 1,
"heldAt": "2026-03-02",
"publishedAt": "2026-03-02T09:00:00.000Z",
"createdAt": "2026-03-02T09:00:00.000Z",
"updatedAt": "2026-03-02T09:00:00.000Z"
}Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
POST /api/v1/exams/{id}/publish
Publish an exam (once only — 409 on re-publish). Emits `exam.published`.
Path & query parameters
| Name | In | Type | Constraints |
|---|---|---|---|
idrequired | path | string | — |
curl example
curl -X POST "https://api.yourdomain.com/api/v1/exams/37386ae0-3738-7738-8386-37386ae03738/publish" \
-H "Authorization: Bearer $INSTITFLOW_API_KEY"Responses
| Name | Type | Constraints |
|---|---|---|
idrequired | string (uuid) | — |
groupIdrequired | string (uuid) | — |
titlerequired | string | — |
kindrequired | enum: "quiz" | "exam" | "homework" | "project" | "final" | — |
maxScorerequired | number | — |
weightrequired | number | — |
heldAtrequired | string (date) | null | — |
publishedAtrequired | string (date-time) | null | — |
createdAtrequired | string (date-time) | — |
updatedAtrequired | string (date-time) | — |
{
"id": "37386ae0-3738-7738-8386-37386ae03738",
"groupId": "6dc7fce6-6dc7-7dc7-8c7f-6dc7fce66dc7",
"title": "Midterm Exam",
"kind": "quiz",
"maxScore": 1,
"weight": 1,
"heldAt": "2026-03-02",
"publishedAt": "2026-03-02T09:00:00.000Z",
"createdAt": "2026-03-02T09:00:00.000Z",
"updatedAt": "2026-03-02T09:00:00.000Z"
}Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
PUT /api/v1/exams/{id}/results
Bulk upsert an exam's results roster.
Path & query parameters
| Name | In | Type | Constraints |
|---|---|---|---|
idrequired | path | string | — |
Request body
| Name | Type | Constraints |
|---|---|---|
resultsrequired | array<object> | — |
Example
{
"results": [
{
"studentId": "a4a70332-a4a7-74a7-8a70-a4a70332a4a7",
"score": 0,
"isAbsent": false,
"remarks": "string"
}
]
}curl example
curl -X PUT "https://api.yourdomain.com/api/v1/exams/37386ae0-3738-7738-8386-37386ae03738/results" \
-H "Authorization: Bearer $INSTITFLOW_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"results": [
{
"studentId": "a4a70332-a4a7-74a7-8a70-a4a70332a4a7",
"score": 0,
"isAbsent": false,
"remarks": "string"
}
]
}'Responses
| Name | Type | Constraints |
|---|---|---|
datarequired | array<object> | — |
{
"data": [
{
"id": "37386ae0-3738-7738-8386-37386ae03738",
"examId": "6c140414-6c14-7c14-8140-6c1404146c14",
"studentId": "a4a70332-a4a7-74a7-8a70-a4a70332a4a7",
"score": 0,
"isAbsent": true,
"remarks": "string",
"gradedByUserId": "71e16c27-71e1-71e1-8e16-71e16c2771e1",
"createdAt": "2026-03-02T09:00:00.000Z",
"updatedAt": "2026-03-02T09:00:00.000Z"
}
]
}Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Path & query parameters
| Name | In | Type | Constraints |
|---|---|---|---|
groupIdrequired | path | string | — |
cursor | query | string | — |
limit | query | integer | 1–100 · default: 25 |
curl example
curl -X GET "https://api.yourdomain.com/api/v1/groups/6dc7fce6-6dc7-7dc7-8c7f-6dc7fce66dc7/exams" \
-H "Authorization: Bearer $INSTITFLOW_API_KEY"Responses
| Name | Type | Constraints |
|---|---|---|
datarequired | array<object> | — |
nextCursorrequired | string | null | — |
{
"data": [
{
"id": "37386ae0-3738-7738-8386-37386ae03738",
"groupId": "6dc7fce6-6dc7-7dc7-8c7f-6dc7fce66dc7",
"title": "Midterm Exam",
"kind": "quiz",
"maxScore": 1,
"weight": 1,
"heldAt": "2026-03-02",
"publishedAt": "2026-03-02T09:00:00.000Z",
"createdAt": "2026-03-02T09:00:00.000Z",
"updatedAt": "2026-03-02T09:00:00.000Z"
}
],
"nextCursor": null
}Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
POST /api/v1/groups/{groupId}/exams
Create an exam for this group.
Path & query parameters
| Name | In | Type | Constraints |
|---|---|---|---|
groupIdrequired | path | string | — |
Request body
| Name | Type | Constraints |
|---|---|---|
titlerequired | string | 1–200 chars |
kindrequired | enum: "quiz" | "exam" | "homework" | "project" | "final" | — |
maxScorerequired | number | ≥0 |
weight | number | ≥0 · default: 1 |
heldAt | string | string (date) | — |
Example
{
"title": "Midterm Exam",
"kind": "quiz",
"maxScore": 0,
"weight": 1,
"heldAt": "string"
}curl example
curl -X POST "https://api.yourdomain.com/api/v1/groups/6dc7fce6-6dc7-7dc7-8c7f-6dc7fce66dc7/exams" \
-H "Authorization: Bearer $INSTITFLOW_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"title": "Midterm Exam",
"kind": "quiz",
"maxScore": 0,
"weight": 1,
"heldAt": "string"
}'Responses
| Name | Type | Constraints |
|---|---|---|
idrequired | string (uuid) | — |
groupIdrequired | string (uuid) | — |
titlerequired | string | — |
kindrequired | enum: "quiz" | "exam" | "homework" | "project" | "final" | — |
maxScorerequired | number | — |
weightrequired | number | — |
heldAtrequired | string (date) | null | — |
publishedAtrequired | string (date-time) | null | — |
createdAtrequired | string (date-time) | — |
updatedAtrequired | string (date-time) | — |
{
"id": "37386ae0-3738-7738-8386-37386ae03738",
"groupId": "6dc7fce6-6dc7-7dc7-8c7f-6dc7fce66dc7",
"title": "Midterm Exam",
"kind": "quiz",
"maxScore": 1,
"weight": 1,
"heldAt": "2026-03-02",
"publishedAt": "2026-03-02T09:00:00.000Z",
"createdAt": "2026-03-02T09:00:00.000Z",
"updatedAt": "2026-03-02T09:00:00.000Z"
}Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
GET /api/v1/me/grades
Own grades (student), or a linked child’s grades via `?studentId` (guardian). Published exams only.
Path & query parameters
| Name | In | Type | Constraints |
|---|---|---|---|
studentId | query | string (uuid) | — |
curl example
curl -X GET "https://api.yourdomain.com/api/v1/me/grades" \
-H "Authorization: Bearer $INSTITFLOW_API_KEY"Responses
| Name | Type | Constraints |
|---|---|---|
studentIdrequired | string (uuid) | — |
groupsrequired | array<object> | — |
{
"studentId": "a4a70332-a4a7-74a7-8a70-a4a70332a4a7",
"groups": [
{
"groupId": "6dc7fce6-6dc7-7dc7-8c7f-6dc7fce66dc7",
"groupName": "string",
"weightedAveragePercentage": 0,
"grade": 1,
"scaleUnsupported": true,
"exams": [
{
"examId": "6c140414-6c14-7c14-8140-6c1404146c14",
"title": "Midterm Exam",
"kind": "quiz",
"maxScore": 1,
"weight": 1,
"score": 0,
"isAbsent": true,
"percentage": 0
}
]
}
]
}Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
GET /api/v1/me/progress-reports
My own (or my children’s) published progress reports, newest first. Drafts are never returned.
Path & query parameters
| Name | In | Type | Constraints |
|---|---|---|---|
cursor | query | string | — |
limit | query | integer | 1–100 · default: 25 |
studentId | query | string (uuid) | — |
curl example
curl -X GET "https://api.yourdomain.com/api/v1/me/progress-reports" \
-H "Authorization: Bearer $INSTITFLOW_API_KEY"Responses
| Name | Type | Constraints |
|---|---|---|
datarequired | array<object> | — |
nextCursorrequired | string | null | — |
{
"data": [
{
"id": "37386ae0-3738-7738-8386-37386ae03738",
"studentId": "a4a70332-a4a7-74a7-8a70-a4a70332a4a7",
"groupId": "6dc7fce6-6dc7-7dc7-8c7f-6dc7fce66dc7",
"periodStart": "2026-03-02",
"periodEnd": "2026-03-02",
"summary": {
"attendance": {
"totalHeld": 0,
"present": 0,
"late": 0,
"absent": 0,
"excused": 0,
"unmarked": 0,
"ratePercentage": 0
},
"weightedAveragePercentage": 0,
"exams": [
{
"examId": "6c140414-6c14-7c14-8140-6c1404146c14",
"title": "Midterm Exam",
"kind": "quiz",
"maxScore": 1,
"weight": 1,
"score": 0,
"isAbsent": true,
"percentage": 0
}
]
},
"teacherComment": "string",
"status": "draft",
"generatedAt": "2026-03-02T09:00:00.000Z",
"sentAt": "2026-03-02T09:00:00.000Z",
"fileId": "0daca32e-0dac-7dac-8aca-0daca32e0dac",
"createdAt": "2026-03-02T09:00:00.000Z",
"updatedAt": "2026-03-02T09:00:00.000Z"
}
],
"nextCursor": null
}Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
GET /api/v1/progress-reports
List progress reports, filterable by studentId, groupId, and/or status.
Path & query parameters
| Name | In | Type | Constraints |
|---|---|---|---|
cursor | query | string | — |
limit | query | integer | 1–100 · default: 25 |
studentId | query | string (uuid) | — |
groupId | query | string (uuid) | — |
status | query | enum: "draft" | "published" | "sent" | — |
curl example
curl -X GET "https://api.yourdomain.com/api/v1/progress-reports" \
-H "Authorization: Bearer $INSTITFLOW_API_KEY"Responses
| Name | Type | Constraints |
|---|---|---|
datarequired | array<object> | — |
nextCursorrequired | string | null | — |
{
"data": [
{
"id": "37386ae0-3738-7738-8386-37386ae03738",
"studentId": "a4a70332-a4a7-74a7-8a70-a4a70332a4a7",
"groupId": "6dc7fce6-6dc7-7dc7-8c7f-6dc7fce66dc7",
"periodStart": "2026-03-02",
"periodEnd": "2026-03-02",
"summary": {
"attendance": {
"totalHeld": 0,
"present": 0,
"late": 0,
"absent": 0,
"excused": 0,
"unmarked": 0,
"ratePercentage": 0
},
"weightedAveragePercentage": 0,
"exams": [
{
"examId": "6c140414-6c14-7c14-8140-6c1404146c14",
"title": "Midterm Exam",
"kind": "quiz",
"maxScore": 1,
"weight": 1,
"score": 0,
"isAbsent": true,
"percentage": 0
}
]
},
"teacherComment": "string",
"status": "draft",
"generatedAt": "2026-03-02T09:00:00.000Z",
"sentAt": "2026-03-02T09:00:00.000Z",
"fileId": "0daca32e-0dac-7dac-8aca-0daca32e0dac",
"createdAt": "2026-03-02T09:00:00.000Z",
"updatedAt": "2026-03-02T09:00:00.000Z"
}
],
"nextCursor": null
}Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
GET /api/v1/progress-reports/{id}
Get one progress report.
Path & query parameters
| Name | In | Type | Constraints |
|---|---|---|---|
idrequired | path | string | — |
curl example
curl -X GET "https://api.yourdomain.com/api/v1/progress-reports/37386ae0-3738-7738-8386-37386ae03738" \
-H "Authorization: Bearer $INSTITFLOW_API_KEY"Responses
| Name | Type | Constraints |
|---|---|---|
idrequired | string (uuid) | — |
studentIdrequired | string (uuid) | — |
groupIdrequired | string (uuid) | null | — |
periodStartrequired | string (date) | — |
periodEndrequired | string (date) | — |
summaryrequired | object | — |
teacherCommentrequired | string | null | 0–2000 chars |
statusrequired | enum: "draft" | "published" | "sent" | — |
generatedAtrequired | string (date-time) | — |
sentAtrequired | string (date-time) | null | — |
fileIdrequired | string (uuid) | null | — |
createdAtrequired | string (date-time) | — |
updatedAtrequired | string (date-time) | — |
{
"id": "37386ae0-3738-7738-8386-37386ae03738",
"studentId": "a4a70332-a4a7-74a7-8a70-a4a70332a4a7",
"groupId": "6dc7fce6-6dc7-7dc7-8c7f-6dc7fce66dc7",
"periodStart": "2026-03-02",
"periodEnd": "2026-03-02",
"summary": {
"attendance": {
"totalHeld": 0,
"present": 0,
"late": 0,
"absent": 0,
"excused": 0,
"unmarked": 0,
"ratePercentage": 0
},
"weightedAveragePercentage": 0,
"exams": [
{
"examId": "6c140414-6c14-7c14-8140-6c1404146c14",
"title": "Midterm Exam",
"kind": "quiz",
"maxScore": 1,
"weight": 1,
"score": 0,
"isAbsent": true,
"percentage": 0
}
]
},
"teacherComment": "string",
"status": "draft",
"generatedAt": "2026-03-02T09:00:00.000Z",
"sentAt": "2026-03-02T09:00:00.000Z",
"fileId": "0daca32e-0dac-7dac-8aca-0daca32e0dac",
"createdAt": "2026-03-02T09:00:00.000Z",
"updatedAt": "2026-03-02T09:00:00.000Z"
}Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
PATCH /api/v1/progress-reports/{id}
Set a progress report's teacher comment.
Path & query parameters
| Name | In | Type | Constraints |
|---|---|---|---|
idrequired | path | string | — |
Request body
| Name | Type | Constraints |
|---|---|---|
teacherCommentrequired | string | 1–2000 chars |
Example
{
"teacherComment": "string"
}curl example
curl -X PATCH "https://api.yourdomain.com/api/v1/progress-reports/37386ae0-3738-7738-8386-37386ae03738" \
-H "Authorization: Bearer $INSTITFLOW_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"teacherComment": "string"
}'Responses
| Name | Type | Constraints |
|---|---|---|
idrequired | string (uuid) | — |
studentIdrequired | string (uuid) | — |
groupIdrequired | string (uuid) | null | — |
periodStartrequired | string (date) | — |
periodEndrequired | string (date) | — |
summaryrequired | object | — |
teacherCommentrequired | string | null | 0–2000 chars |
statusrequired | enum: "draft" | "published" | "sent" | — |
generatedAtrequired | string (date-time) | — |
sentAtrequired | string (date-time) | null | — |
fileIdrequired | string (uuid) | null | — |
createdAtrequired | string (date-time) | — |
updatedAtrequired | string (date-time) | — |
{
"id": "37386ae0-3738-7738-8386-37386ae03738",
"studentId": "a4a70332-a4a7-74a7-8a70-a4a70332a4a7",
"groupId": "6dc7fce6-6dc7-7dc7-8c7f-6dc7fce66dc7",
"periodStart": "2026-03-02",
"periodEnd": "2026-03-02",
"summary": {
"attendance": {
"totalHeld": 0,
"present": 0,
"late": 0,
"absent": 0,
"excused": 0,
"unmarked": 0,
"ratePercentage": 0
},
"weightedAveragePercentage": 0,
"exams": [
{
"examId": "6c140414-6c14-7c14-8140-6c1404146c14",
"title": "Midterm Exam",
"kind": "quiz",
"maxScore": 1,
"weight": 1,
"score": 0,
"isAbsent": true,
"percentage": 0
}
]
},
"teacherComment": "string",
"status": "draft",
"generatedAt": "2026-03-02T09:00:00.000Z",
"sentAt": "2026-03-02T09:00:00.000Z",
"fileId": "0daca32e-0dac-7dac-8aca-0daca32e0dac",
"createdAt": "2026-03-02T09:00:00.000Z",
"updatedAt": "2026-03-02T09:00:00.000Z"
}Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
POST /api/v1/progress-reports/{id}/publish
Publish a draft progress report (409 if not currently draft).
Path & query parameters
| Name | In | Type | Constraints |
|---|---|---|---|
idrequired | path | string | — |
curl example
curl -X POST "https://api.yourdomain.com/api/v1/progress-reports/37386ae0-3738-7738-8386-37386ae03738/publish" \
-H "Authorization: Bearer $INSTITFLOW_API_KEY"Responses
| Name | Type | Constraints |
|---|---|---|
idrequired | string (uuid) | — |
studentIdrequired | string (uuid) | — |
groupIdrequired | string (uuid) | null | — |
periodStartrequired | string (date) | — |
periodEndrequired | string (date) | — |
summaryrequired | object | — |
teacherCommentrequired | string | null | 0–2000 chars |
statusrequired | enum: "draft" | "published" | "sent" | — |
generatedAtrequired | string (date-time) | — |
sentAtrequired | string (date-time) | null | — |
fileIdrequired | string (uuid) | null | — |
createdAtrequired | string (date-time) | — |
updatedAtrequired | string (date-time) | — |
{
"id": "37386ae0-3738-7738-8386-37386ae03738",
"studentId": "a4a70332-a4a7-74a7-8a70-a4a70332a4a7",
"groupId": "6dc7fce6-6dc7-7dc7-8c7f-6dc7fce66dc7",
"periodStart": "2026-03-02",
"periodEnd": "2026-03-02",
"summary": {
"attendance": {
"totalHeld": 0,
"present": 0,
"late": 0,
"absent": 0,
"excused": 0,
"unmarked": 0,
"ratePercentage": 0
},
"weightedAveragePercentage": 0,
"exams": [
{
"examId": "6c140414-6c14-7c14-8140-6c1404146c14",
"title": "Midterm Exam",
"kind": "quiz",
"maxScore": 1,
"weight": 1,
"score": 0,
"isAbsent": true,
"percentage": 0
}
]
},
"teacherComment": "string",
"status": "draft",
"generatedAt": "2026-03-02T09:00:00.000Z",
"sentAt": "2026-03-02T09:00:00.000Z",
"fileId": "0daca32e-0dac-7dac-8aca-0daca32e0dac",
"createdAt": "2026-03-02T09:00:00.000Z",
"updatedAt": "2026-03-02T09:00:00.000Z"
}Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
POST /api/v1/progress-reports/{id}/send
Send a published progress report to its guardians (409 unless currently published). Emits `progress_report.sent`.
Path & query parameters
| Name | In | Type | Constraints |
|---|---|---|---|
idrequired | path | string | — |
curl example
curl -X POST "https://api.yourdomain.com/api/v1/progress-reports/37386ae0-3738-7738-8386-37386ae03738/send" \
-H "Authorization: Bearer $INSTITFLOW_API_KEY"Responses
| Name | Type | Constraints |
|---|---|---|
idrequired | string (uuid) | — |
studentIdrequired | string (uuid) | — |
groupIdrequired | string (uuid) | null | — |
periodStartrequired | string (date) | — |
periodEndrequired | string (date) | — |
summaryrequired | object | — |
teacherCommentrequired | string | null | 0–2000 chars |
statusrequired | enum: "draft" | "published" | "sent" | — |
generatedAtrequired | string (date-time) | — |
sentAtrequired | string (date-time) | null | — |
fileIdrequired | string (uuid) | null | — |
createdAtrequired | string (date-time) | — |
updatedAtrequired | string (date-time) | — |
{
"id": "37386ae0-3738-7738-8386-37386ae03738",
"studentId": "a4a70332-a4a7-74a7-8a70-a4a70332a4a7",
"groupId": "6dc7fce6-6dc7-7dc7-8c7f-6dc7fce66dc7",
"periodStart": "2026-03-02",
"periodEnd": "2026-03-02",
"summary": {
"attendance": {
"totalHeld": 0,
"present": 0,
"late": 0,
"absent": 0,
"excused": 0,
"unmarked": 0,
"ratePercentage": 0
},
"weightedAveragePercentage": 0,
"exams": [
{
"examId": "6c140414-6c14-7c14-8140-6c1404146c14",
"title": "Midterm Exam",
"kind": "quiz",
"maxScore": 1,
"weight": 1,
"score": 0,
"isAbsent": true,
"percentage": 0
}
]
},
"teacherComment": "string",
"status": "draft",
"generatedAt": "2026-03-02T09:00:00.000Z",
"sentAt": "2026-03-02T09:00:00.000Z",
"fileId": "0daca32e-0dac-7dac-8aca-0daca32e0dac",
"createdAt": "2026-03-02T09:00:00.000Z",
"updatedAt": "2026-03-02T09:00:00.000Z"
}Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
POST /api/v1/progress-reports/generate
Enqueue progress-report generation for a group (one draft per enrolled student) or a single student.
Request body
| Name | Type | Constraints |
|---|---|---|
groupId | string (uuid) | — |
studentId | string (uuid) | — |
periodStartrequired | string (date) | — |
periodEndrequired | string (date) | — |
Example
{
"groupId": "6dc7fce6-6dc7-7dc7-8c7f-6dc7fce66dc7",
"studentId": "a4a70332-a4a7-74a7-8a70-a4a70332a4a7",
"periodStart": "2026-03-02",
"periodEnd": "2026-03-02"
}curl example
curl -X POST "https://api.yourdomain.com/api/v1/progress-reports/generate" \
-H "Authorization: Bearer $INSTITFLOW_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"groupId": "6dc7fce6-6dc7-7dc7-8c7f-6dc7fce66dc7",
"studentId": "a4a70332-a4a7-74a7-8a70-a4a70332a4a7",
"periodStart": "2026-03-02",
"periodEnd": "2026-03-02"
}'Responses
| Name | Type | Constraints |
|---|---|---|
queuedrequired | enum: true | — |
{
"queued": true
}Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
GET /api/v1/students/{id}/grades
Per-exam scores and per-group weighted average (scaled via `grading.scale`) for one student.
Path & query parameters
| Name | In | Type | Constraints |
|---|---|---|---|
idrequired | path | string | — |
groupId | query | string (uuid) | — |
curl example
curl -X GET "https://api.yourdomain.com/api/v1/students/37386ae0-3738-7738-8386-37386ae03738/grades" \
-H "Authorization: Bearer $INSTITFLOW_API_KEY"Responses
| Name | Type | Constraints |
|---|---|---|
studentIdrequired | string (uuid) | — |
groupsrequired | array<object> | — |
{
"studentId": "a4a70332-a4a7-74a7-8a70-a4a70332a4a7",
"groups": [
{
"groupId": "6dc7fce6-6dc7-7dc7-8c7f-6dc7fce66dc7",
"groupName": "string",
"weightedAveragePercentage": 0,
"grade": 1,
"scaleUnsupported": true,
"exams": [
{
"examId": "6c140414-6c14-7c14-8140-6c1404146c14",
"title": "Midterm Exam",
"kind": "quiz",
"maxScore": 1,
"weight": 1,
"score": 0,
"isAbsent": true,
"percentage": 0
}
]
}
]
}Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.
Returns the shared `ErrorEnvelope` — `{ error: { code, message, requestId, details? } }`. Every code is listed in the Conventions guide.