API Tryout

Endpoint konfigurasi tryout, kalibrasi IRT, dan normalisasi.

API: Tryout

Source: backend/app/routers/tryouts.py Schemas: backend/app/schemas/tryout.py

Endpoint untuk konfigurasi tryout, trigger kalibrasi IRT, dan update normalisasi.

Endpoint Reference

GET /api/v1/tryout/ — List Tryouts

Implemented. List semua tryout di website.

http
GET /api/v1/tryout/
Authorization: Bearer {token}
X-Website-ID: 1

Response 200 OK:

json
[
  {
    "tryout_id": "132380",
    "name": "Tryout PEKA Logika Paket 1",
    "scoring_mode": "ctt",
    "selection_mode": "fixed",
    "normalization_mode": "static",
    "items_count": 50,
    "sessions_count": 120
  }
]

GET /api/v1/tryout/{tryout_id}/config — Get Configuration

Implemented. Ambil konfigurasi tryout lengkap.

http
GET /api/v1/tryout/132380/config
Authorization: Bearer {token}
X-Website-ID: 1

Response 200 OK:

json
{
  "tryout_id": "132380",
  "name": "Tryout PEKA Logika Paket 1",
  "scoring_mode": "ctt",
  "selection_mode": "fixed",
  "normalization_mode": "static",
  "min_sample_for_dynamic": 100,
  "static_rataan": 500.0,
  "static_sb": 100.0,
  "ai_generation_enabled": false,
  "hybrid_transition_slot": null,
  "min_calibration_sample": 100,
  "theta_estimation_method": "mle",
  "fallback_to_ctt_on_error": true
}

Penjelasan field: lihat Konsep → Variabel dan Konsep → Mode Tryout.

PUT /api/v1/tryout/{tryout_id}/config — Update Configuration

Implemented. Update konfigurasi tryout (admin only).

http
PUT /api/v1/tryout/132380/config
Authorization: Bearer {admin_token}
X-Website-ID: 1
Content-Type: application/json

{
  "scoring_mode": "hybrid",
  "selection_mode": "hybrid",
  "hybrid_transition_slot": 10
}

Aturan:

  • Hanya field yang di-pass yang akan di-update (partial update)
  • Sesi yang sedang berjalan tidak terpengaruh (snapshot saat mulai)

PUT /api/v1/tryout/{tryout_id}/normalization — Update Normalization

Implemented. Update setting normalisasi (admin only).

http
PUT /api/v1/tryout/132380/normalization
Authorization: Bearer {admin_token}
X-Website-ID: 1
Content-Type: application/json

{
  "normalization_mode": "dynamic",
  "min_sample_for_dynamic": 50,
  "static_rataan": 500.0,
  "static_sb": 100.0
}

Detail mode normalisasi: lihat Modul → Normalization.

GET /api/v1/tryout/{tryout_id}/calibration-status — Calibration Status

Implemented. Cek status kalibrasi IRT untuk semua item di tryout.

http
GET /api/v1/tryout/132380/calibration-status
Authorization: Bearer {token}
X-Website-ID: 1

Response 200 OK:

json
{
  "tryout_id": "132380",
  "total_items": 50,
  "calibrated_items": 32,
  "uncalibrated_items": 18,
  "total_responses": 4200,
  "ready_for_calibration": true,
  "items": [
    {"item_id": 1, "calibrated": true, "calibration_sample_size": 95, "irt_b": -0.234},
    {"item_id": 2, "calibrated": false, "calibration_sample_size": 45, "irt_b": null}
  ]
}

POST /api/v1/tryout/{tryout_id}/calibrate — Trigger Batch Calibration

Implemented. Jalankan kalibrasi IRT untuk semua item yang punya cukup respon.

http
POST /api/v1/tryout/132380/calibrate
Authorization: Bearer {admin_token}
X-Website-ID: 1
Content-Type: application/json

{
  "force_recalibrate": false,
  "min_sample_override": null
}

Response 200 OK:

json
{
  "tryout_id": "132380",
  "calibrated_count": 18,
  "skipped_count": 32,
  "failed_count": 0,
  "errors": [],
  "duration_ms": 4500
}

Aturan:

  • Heavy operation — pakai background job kalau item > 100
  • Pakai min_calibration_sample tryout sebagai threshold default
  • force_recalibrate=true untuk re-kalibrasi item yang sudah terkalibrasi

Detail algoritma: lihat Modul → IRT Calibration.

POST /api/v1/tryout/{tryout_id}/calibrate/{item_id} — Calibrate Single Item

Implemented. Kalibrasi satu item tertentu.

http
POST /api/v1/tryout/132380/calibrate/42
Authorization: Bearer {admin_token}
X-Website-ID: 1

Response 200 OK:

json
{
  "item_id": 42,
  "calibrated": true,
  "irt_b": 0.234,
  "irt_se": 0.12,
  "calibration_sample_size": 110,
  "converged": true,
  "iterations": 8
}

Permission Matrix

EndpointRole yang Bisa
GET /tryout/student, admin, system_admin
GET /tryout/{id}/configstudent, admin, system_admin
PUT /tryout/{id}/configadmin, system_admin
PUT /tryout/{id}/normalizationadmin, system_admin
GET /tryout/{id}/calibration-statusadmin, system_admin
POST /tryout/{id}/calibrateadmin, system_admin
POST /tryout/{id}/calibrate/{item_id}admin, system_admin

Bacaan Lanjutan

Last updated Jul 25, 2026