> ## 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.

# Participants API

> Manage participant accounts and participant labels through the Client Integration API.

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

## Participant endpoints

> [accordion] GET /participants — List participants
>
> ### Parameters
>
> | Name | Location | Required | Type | Description |
> | - | - | -: | - | - |
> | `search` | Query | No | string | Searches by name or email. |
> | `email` | Query | No | email | Matches the email exactly. |
> | `label_id` | Query | No | integer | Filters by label ID. |
> | `is_active` | Query | No | boolean | Filters by active status. |
> | `is_verified` | Query | No | boolean | Filters by account verification status. |
> | `sort_by` | Query | No | enum | `name`, `created_at`, `updated_at` or `id`. Default `name`. |
> | `sort_dir` | Query | No | enum | `asc` or `desc`. Default `asc`. |
> | `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/participants?search=Budi&is_active=true&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": 340,
>       "name": "Budi Santoso",
>       "email": "budi@sekolah.sch.id",
>       "is_active": true,
>       "is_verified": true,
>       "verified_at": "2026-07-30T09:00:00+07:00",
>       "label": { "id": 8, "name": "Kelas XII IPA" },
>       "created_at": "2026-07-30T09:00:00+07:00",
>       "updated_at": "2026-07-30T09:00:00+07:00"
>     }
>   ],
>   "meta": {
>     "pagination": {
>       "total": 1,
>       "per_page": 25,
>       "current_page": 1,
>       "last_page": 1,
>       "from": 1,
>       "to": 1
>     }
>   }
> }
> ```

> [accordion] POST /participants — Create a participant
>
> Participants created through the API are verified straight away. The email is stored in lowercase. If a participant with the same email was previously deleted from the project, that account is restored and updated with the data you send.
>
> ### Parameters
>
> | Name | Location | Required | Type | Description |
> | - | - | -: | - | - |
> | `email` | Body | Yes | email | Must be unique within the project, up to 255 characters. |
> | `name` | Body | Yes | string | Participant name, up to 255 characters. |
> | `password` | Body | Yes | string | 6–255 characters long. |
> | `label_id` | Body | No | integer/null | ID of a label that belongs to the project. |
> | `is_active` | Body | No | boolean | Default `true`. |
>
> ### Example request
>
> ```bash theme={null}
> curl -X POST "https://app.indolat.com/api/v1/participants" \
>   -H "Authorization: Bearer <API_KEY>" \
>   -H "Accept: application/json" \
>   -H "Content-Type: application/json" \
>   -d '{
>     "email": "budi@sekolah.sch.id",
>     "name": "Budi Santoso",
>     "password": "rahasia123",
>     "label_id": 8,
>     "is_active": true
>   }'
> ```
>
> ### Example response
>
> Status `201`.
>
> ```json theme={null}
> {
>   "success": true,
>   "message": "Peserta berhasil dibuat.",
>   "data": {
>     "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",
>     "label": { "id": 8, "name": "Kelas XII IPA" },
>     "created_at": "2026-07-30T09:00:00+07:00",
>     "updated_at": "2026-07-30T09:00:00+07:00"
>   }
> }
> ```

> [accordion] POST /participants/batch — Create or update participants in batch
>
> Participants are matched by email. The format of every row is validated first: a single invalid row rejects the whole request with status `422`, and the error key points to that row (for example `participants.3.email`). Once validation passes, each row is processed separately and the outcome is reported per row:
>
> * `created` — a new participant was created, or a previously deleted participant was restored.
>
> * `updated` — the participant already exists and `update_existing` is `true`.
>
> * `skipped` — the participant already exists and `update_existing` is `false`. The item includes a `reason`.
>
> * `failed` — the row could not be processed. The item includes a `reason` and no `participant_id`.
>
> > [!WARNING]
> >
> > With `update_existing: true`, an existing participant's data is replaced with the row's contents: name, password and label. The label is removed if `label_id` is not sent, and an inactive participant is reactivated.
>
> ### Parameters
>
> | Name | Location | Required | Type | Description |
> | - | - | -: | - | - |
> | `participants` | Body | Yes | array | Contains 1–500 participants. |
> | `participants.*.email` | Body | Yes | email | Participant email, up to 255 characters. |
> | `participants.*.name` | Body | Yes | string | Participant name, up to 255 characters. |
> | `participants.*.password` | Body | Yes | string | 6–255 characters long. |
> | `participants.*.label_id` | Body | No | integer/null | ID of a label that belongs to the project. |
> | `update_existing` | Body | No | boolean | If `true`, existing participants are updated. Default `false`. |
>
> ### Example request
>
> ```bash theme={null}
> curl -X POST "https://app.indolat.com/api/v1/participants/batch" \
>   -H "Authorization: Bearer <API_KEY>" \
>   -H "Accept: application/json" \
>   -H "Content-Type: application/json" \
>   -d '{
>     "participants": [
>       {
>         "email": "budi@sekolah.sch.id",
>         "name": "Budi Santoso",
>         "password": "rahasia123",
>         "label_id": 8
>       },
>       {
>         "email": "siti@sekolah.sch.id",
>         "name": "Siti Aminah",
>         "password": "rahasia456",
>         "label_id": 8
>       }
>     ],
>     "update_existing": false
>   }'
> ```
>
> ### Example response
>
> ```json theme={null}
> {
>   "success": true,
>   "message": "2 peserta dibuat, 0 diperbarui, 0 dilewati, 0 gagal.",
>   "data": {
>     "created": [
>       { "index": 0, "email": "budi@sekolah.sch.id", "participant_id": 340 },
>       { "index": 1, "email": "siti@sekolah.sch.id", "participant_id": 341 }
>     ],
>     "updated": [],
>     "skipped": [],
>     "failed": []
>   },
>   "meta": {
>     "summary": { "total": 2, "created": 2, "updated": 0, "skipped": 0, "failed": 0 }
>   }
> }
> ```

> [accordion] GET /participants/\{id} — Participant details
>
> ### Parameters
>
> | Name | Location | Required | Type | Description |
> | - | - | -: | - | - |
> | `id` | Path | Yes | integer | Participant ID. |
>
> ### Example request
>
> ```bash theme={null}
> curl -X GET "https://app.indolat.com/api/v1/participants/340" \
>   -H "Authorization: Bearer <API_KEY>" \
>   -H "Accept: application/json"
> ```
>
> ### Example response
>
> ```json theme={null}
> {
>   "success": true,
>   "message": null,
>   "data": {
>     "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",
>     "label": { "id": 8, "name": "Kelas XII IPA" },
>     "created_at": "2026-07-30T09:00:00+07:00",
>     "updated_at": "2026-07-30T09:00:00+07:00"
>   }
> }
> ```

> [accordion] PATCH /participants/\{id} — Update a participant
>
> This endpoint also accepts the `PUT` method.
>
> ### Parameters
>
> | Name | Location | Required | Type | Description |
> | - | - | -: | - | - |
> | `id` | Path | Yes | integer | Participant ID. |
> | `name` | Body | No | string | New name, up to 255 characters. |
> | `password` | Body | No | string | New password, 6–255 characters. |
> | `label_id` | Body | No | integer/null | New label ID, or `null` to remove the label. |
> | `is_active` | Body | No | boolean | New active status. |
>
> Fields you don't send are left unchanged. The email cannot be changed through the API. A participant with `is_active: false` cannot sign in to the CBT, including through an exam access link.
>
> ### Example request
>
> ```bash theme={null}
> curl -X PATCH "https://app.indolat.com/api/v1/participants/340" \
>   -H "Authorization: Bearer <API_KEY>" \
>   -H "Accept: application/json" \
>   -H "Content-Type: application/json" \
>   -d '{
>     "name": "Budi Santoso Putra",
>     "label_id": 9,
>     "is_active": true
>   }'
> ```
>
> ### Example response
>
> ```json theme={null}
> {
>   "success": true,
>   "message": "Peserta berhasil diperbarui.",
>   "data": {
>     "id": 340,
>     "name": "Budi Santoso Putra",
>     "email": "budi@sekolah.sch.id",
>     "is_active": true,
>     "is_verified": true,
>     "verified_at": "2026-07-30T09:00:00+07:00",
>     "label": { "id": 9, "name": "Kelas XII" },
>     "created_at": "2026-07-30T09:00:00+07:00",
>     "updated_at": "2026-08-03T10:15:00+07:00"
>   }
> }
> ```

> [accordion] DELETE /participants/\{id} — Delete a participant
>
> A participant who is still registered for an exam cannot be deleted; the request is rejected with status `409`. Cancel their exam registration first with `DELETE /exams/{exam}/participants/{participant}`.
>
> ### Parameters
>
> | Name | Location | Required | Type | Description |
> | - | - | -: | - | - |
> | `id` | Path | Yes | integer | Participant ID. |
>
> ### Example request
>
> ```bash theme={null}
> curl -X DELETE "https://app.indolat.com/api/v1/participants/340" \
>   -H "Authorization: Bearer <API_KEY>" \
>   -H "Accept: application/json"
> ```
>
> ### Example response
>
> ```json theme={null}
> {
>   "success": true,
>   "message": "Peserta berhasil dihapus.",
>   "data": null
> }
> ```

> [accordion] GET /participants/\{id}/exams — List a participant's exams
>
> Sorted from the most recent registration. `results` contains one item for each test in the exam, with the same structure as in the [Exam Results API](https://help.indolat.com/en/api/hasil-ujian.md).
>
> ### Parameters
>
> | Name | Location | Required | Type | Description |
> | - | - | -: | - | - |
> | `id` | Path | Yes | integer | Participant ID. |
> | `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/participants/340/exams?page=1&per_page=25" \
>   -H "Authorization: Bearer <API_KEY>" \
>   -H "Accept: application/json"
> ```
>
> ### Example response
>
> ```json theme={null}
> {
>   "success": true,
>   "message": null,
>   "data": [
>     {
>       "user_exam_id": 4410,
>       "participant_id": 340,
>       "exam_id": 12,
>       "participant_code": "TPA0000021",
>       "status": 1,
>       "status_label": "Aktif",
>       "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"
>       },
>       "results": [
>         {
>           "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 },
>           "start_at": "2026-08-10T08:05:00+07:00",
>           "end_at": "2026-08-10T09:20:00+07:00",
>           "duration_seconds": 4500,
>           "created_at": "2026-07-30T10:00:00+07:00",
>           "updated_at": "2026-08-10T09:20:00+07:00"
>         }
>       ],
>       "registered_at": "2026-07-30T10:00:00+07:00"
>     }
>   ],
>   "meta": {
>     "pagination": { "total": 1, "per_page": 25, "current_page": 1, "last_page": 1, "from": 1, "to": 1 }
>   }
> }
> ```

> [accordion] GET /participant-labels — List participant labels
>
> ### Parameters
>
> | Name | Location | Required | Type | Description |
> | - | - | -: | - | - |
> | `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/participant-labels?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": 8,
>       "name": "Kelas XII IPA",
>       "participants_count": 32,
>       "created_at": "2026-07-01T08:00:00+07:00",
>       "updated_at": "2026-07-01T08:00:00+07:00"
>     }
>   ],
>   "meta": {
>     "pagination": { "total": 1, "per_page": 25, "current_page": 1, "last_page": 1, "from": 1, "to": 1 }
>   }
> }
> ```

> [accordion] POST /participant-labels — Create a participant label
>
> ### Parameters
>
> | Name | Location | Required | Type | Description |
> | - | - | -: | - | - |
> | `name` | Body | Yes | string | Unique name within the project, up to 255 characters. |
>
> ### Example request
>
> ```bash theme={null}
> curl -X POST "https://app.indolat.com/api/v1/participant-labels" \
>   -H "Authorization: Bearer <API_KEY>" \
>   -H "Accept: application/json" \
>   -H "Content-Type: application/json" \
>   -d '{ "name": "Kelas XII IPA" }'
> ```
>
> ### Example response
>
> ```json theme={null}
> {
>   "success": true,
>   "message": "Label berhasil dibuat.",
>   "data": {
>     "id": 8,
>     "name": "Kelas XII IPA",
>     "created_at": "2026-08-03T10:00:00+07:00",
>     "updated_at": "2026-08-03T10:00:00+07:00"
>   }
> }
> ```


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