> ## Documentation Index
> Fetch the complete documentation index at: https://help.indolat.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Exam Results API

> Retrieve the list and details of participants' exam results, including scores and time spent.

Every request on this page requires a [Bearer API key](https://help.indolat.com/en/api/autentikasi.md).

One exam result represents one test taken by one participant. The result record is created when the participant is registered for the exam, then updated as the participant takes the test and when the score is calculated. Results that belong to participants deleted from the project are not shown.

## When scores are available

`score` is `null` until the test score is calculated. When that happens depends on the test's scoring method:

| Scoring method | When `score` is filled in |
| - | - |
| Question Score Calculation (Sum of Correct/Wrong) | Automatically when the participant finishes the test. |
| Answer Score Calculation (Sum of Answer Scores) | Automatically when the participant finishes the test. |
| Psychometric (Answer Grouping) | Automatically when the participant finishes. `score` is always `0`; results per answer group are not available through the API. |
| IRT (UTBK reference, 0-1000), IRT TKA for SMA/SMK (200-800), IRT TKA for SD/SMP (0-100) | After an admin runs **Calculate Score** → **IRT Calculation** in the admin panel. Until then, `score` is `null`. |
| Manual Scoring | After an admin grades the participant's answers in the admin panel. |

A score can change after it is first published, for example when an admin runs **IRT Calculation** again or recalculates scores. Every change updates `updated_at` and sends an `exam_result.scored` webhook. Use `updated_since` to resync results that have changed.

### `meta_score` structure

`meta_score` is `null` until the score is first calculated. Its contents depend on the scoring method:

| Scoring method | `meta_score` contents |
| - | - |
| Sum of Correct/Wrong | `correct`, `incorrect`, `unanswered` (number of questions). |
| Sum of Answer Scores | `correct`, `incorrect`, `unanswered`, and `answer_scores` as an object `{ "<question id>": score }`. |
| Psychometric | `total_answered`, `total_unanswered`. |
| IRT | `correct`, `incorrect`, `unanswered`, `irt_theta` (the participant's ability), `irt_scale` (the scale used: `irt`, `irt_tka_sma` or `irt_tka_sd_smp`), and `difficulty_map` as an object `{ "<question id>": difficulty }`. |

## Exam result endpoints

> [accordion] GET /exam-results — List exam results
>
> Sorted from the most recent result.
>
> ### Parameters
>
> | Name | Location | Required | Type | Description |
> | - | - | -: | - | - |
> | `exam_id` | Query | No | integer | Filters by exam ID. |
> | `participant_id` | Query | No | integer | Filters by participant ID. |
> | `email` | Query | No | email | Filters by participant email (exact match). |
> | `exam_quiz_id` | Query | No | integer | Filters by test ID. |
> | `status` | Query | No | integer | `0` pending, `1` active (not started yet or in progress), `2` finished, `3` rejected. |
> | `min_score` | Query | No | numeric | Minimum score. |
> | `max_score` | Query | No | numeric | Maximum score. |
> | `finished_from` | Query | No | datetime | Earliest finish time, in ISO 8601; must be URL-encoded. |
> | `finished_until` | Query | No | datetime | Latest finish time, in ISO 8601; must be URL-encoded. |
> | `updated_since` | Query | No | datetime | Only results changed since this time; ISO 8601, must be URL-encoded. |
> | `page` | Query | No | integer | Page number. Default `1`. |
> | `per_page` | Query | No | integer | Items per page, `1–100`. Default `25`. |
>
> ### Example request
>
> ```bash theme={null}
> curl -X GET "https://app.indolat.com/api/v1/exam-results?exam_id=12&status=2&min_score=70&page=1&per_page=25" \
>   -H "Authorization: Bearer <API_KEY>" \
>   -H "Accept: application/json"
> ```
>
> ### Example response
>
> ```json theme={null}
> {
>   "success": true,
>   "message": null,
>   "data": [
>     {
>       "id": 9812,
>       "uuid": "9f1c2a2d-9739-4c2f-9a94-312a9cc1b4ad",
>       "user_exam_id": 4410,
>       "exam_quiz_id": 45,
>       "exam_quiz_name": "Tes Potensi Akademik",
>       "status": 2,
>       "status_label": "Selesai Ujian",
>       "score": 82.5,
>       "meta_score": { "correct": 33, "incorrect": 7, "unanswered": 0 },
>       "session": {
>         "id": 91,
>         "exam_quiz_id": 45,
>         "name": "Sesi Pagi",
>         "start_at": "2026-08-10T08:00:00+07:00",
>         "end_at": "2026-08-10T10:00:00+07:00"
>       },
>       "start_at": "2026-08-10T08:05:00+07:00",
>       "end_at": "2026-08-10T09:20:00+07:00",
>       "duration_seconds": 4500,
>       "participant_code": "TPA0000021",
>       "participant": {
>         "id": 340,
>         "name": "Budi Santoso",
>         "email": "budi@sekolah.sch.id",
>         "is_active": true,
>         "is_verified": true,
>         "verified_at": "2026-07-30T09:00:00+07:00",
>         "created_at": "2026-07-30T09:00:00+07:00",
>         "updated_at": "2026-07-30T09:00:00+07:00"
>       },
>       "exam": {
>         "id": 12,
>         "name": "Tes Masuk 2026",
>         "name_short": "TPA",
>         "slug": "tes-masuk-2026",
>         "description": "Seleksi penerimaan peserta didik baru.",
>         "price": 0,
>         "start_at": "2026-08-10T08:00:00+07:00",
>         "end_at": "2026-08-10T12:00:00+07:00",
>         "is_active": true,
>         "is_locked": false,
>         "is_hidden": false,
>         "is_tiered": false,
>         "is_auto_assign_session": true,
>         "is_show_score": true,
>         "final_score_type": 2,
>         "final_score_type_label": "Rata-Rata Tes Ujian",
>         "paid_type": 1,
>         "paid_type_label": "Gratis",
>         "registration_quota": 500,
>         "created_at": "2026-07-01T08:00:00+07:00",
>         "updated_at": "2026-07-30T08:00:00+07:00"
>       },
>       "created_at": "2026-07-30T10:00:00+07:00",
>       "updated_at": "2026-08-10T09:20:00+07:00"
>     }
>   ],
>   "meta": {
>     "pagination": { "total": 1, "per_page": 25, "current_page": 1, "last_page": 1, "from": 1, "to": 1 }
>   }
> }
> ```

> [accordion] GET /exam-results/\{id} — Exam result details
>
> ### Parameters
>
> | Name | Location | Required | Type | Description |
> | - | - | -: | - | - |
> | `id` | Path | Yes | integer | Exam result ID. |
>
> ### Example request
>
> ```bash theme={null}
> curl -X GET "https://app.indolat.com/api/v1/exam-results/9813" \
>   -H "Authorization: Bearer <API_KEY>" \
>   -H "Accept: application/json"
> ```
>
> ### Example response
>
> The example below is a test scored with IRT whose score has already been calculated. The `exam` object is shortened; its contents are the same as in the exam result list example.
>
> ```json theme={null}
> {
>   "success": true,
>   "message": null,
>   "data": {
>     "id": 9813,
>     "uuid": "3b7e5d10-1c2f-4a8e-b0e4-6a2f1d9c7e21",
>     "user_exam_id": 4410,
>     "exam_quiz_id": 46,
>     "exam_quiz_name": "Penalaran Umum",
>     "status": 2,
>     "status_label": "Selesai Ujian",
>     "score": 642,
>     "meta_score": {
>       "correct": 22,
>       "incorrect": 6,
>       "unanswered": 2,
>       "irt_theta": 1.1368,
>       "irt_scale": "irt",
>       "difficulty_map": { "1201": -0.8473, "1202": 0.4055, "1203": 1.3863 }
>     },
>     "session": {
>       "id": 92,
>       "exam_quiz_id": 46,
>       "name": "Sesi Pagi",
>       "start_at": "2026-08-10T08:00:00+07:00",
>       "end_at": "2026-08-10T10:00:00+07:00"
>     },
>     "start_at": "2026-08-10T09:25:00+07:00",
>     "end_at": "2026-08-10T09:55:00+07:00",
>     "duration_seconds": 1800,
>     "participant_code": "TPA0000021",
>     "participant": {
>       "id": 340,
>       "name": "Budi Santoso",
>       "email": "budi@sekolah.sch.id",
>       "is_active": true,
>       "is_verified": true,
>       "verified_at": "2026-07-30T09:00:00+07:00",
>       "created_at": "2026-07-30T09:00:00+07:00",
>       "updated_at": "2026-07-30T09:00:00+07:00"
>     },
>     "exam": {
>       "id": 12,
>       "name": "Tes Masuk 2026",
>       "name_short": "TPA",
>       "slug": "tes-masuk-2026"
>     },
>     "created_at": "2026-07-30T10:00:00+07:00",
>     "updated_at": "2026-08-11T08:00:00+07:00"
>   }
> }
> ```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.