Langsung ke konten utama
Seluruh request pada halaman ini membutuhkan Bearer API Key. API ini mengubah satu revisi paket soal dari sistem Anda menjadi satu paket soal baru di panel, lengkap dengan wacana, gambar, audio, dan kunci jawaban. Import tidak membuat ujian: setelah import selesai, pasang paket soal tersebut ke sesi ujian melalui panel.

Alur

  1. Siapkan media. Gambar dapat ditulis sebagai link https langsung di paket, atau diunggah dulu ke POST /question-assets untuk mendapatkan asset_id. Audio hanya dapat dikirim lewat unggahan.
  2. (Opsional) Periksa paket dengan POST /question-imports/validate.
  3. Kirim paket ke POST /question-imports dengan header Idempotency-Key. Paket diperiksa saat itu juga; jika valid, respons 202 dan paket diproses di latar belakang.
  4. Pantau hasilnya lewat GET /question-imports/{id} atau webhook question_import.completed dan question_import.failed.
  5. Simpan question_bank.id untuk revisi tersebut dan question_id untuk setiap soal.
Paket soal hasil import tidak dapat diubah di panel: soal, jawaban, dan wacananya terkunci agar setiap peserta dinilai dengan soal dan kunci jawaban yang sama persis dengan yang Anda kirim. Kirim koreksi sebagai revisi baru. Jika perlu mengubah isinya secara manual, gunakan Duplikat Paket Soal; salinannya dapat diubah seperti paket soal biasa.

Format error

Endpoint pada halaman ini mengembalikan errors berupa daftar, bukan objek per field seperti endpoint lain, karena satu paket dapat berisi ratusan soal. pointer adalah JSON Pointer ke bagian body yang bermasalah dan source_item_id adalah source_id soal atau wacana tersebut; untuk error yang tidak terkait satu soal, keduanya bernilai null. Satu respons memuat paling banyak 1.000 error.

Endpoint

Mengunggah satu berkas dengan multipart/form-data. Tipe berkas dibaca dari isinya, bukan dari nama atau tipe yang dikirim.
  • Gambar: JPEG, PNG, WebP, atau GIF, maksimal 5 MB dan 10.000 piksel per sisi.
  • Audio: MP3, WAV, atau OGG, maksimal 10 MB.
  • SVG dan berkas lain ditolak.
Berkas yang sama persis (isi identik) mengembalikan asset_id yang sama dengan status 200 dan masa berlaku yang diperpanjang. Aset dapat dipakai di paket mana pun sampai expires_at (7 hari setelah diunggah); setelah itu aset dihapus. Import menyalin berkasnya ke paket soal, sehingga soal tidak terpengaruh saat aset kedaluwarsa.

Parameter

Contoh request

Contoh response

Status 201.
Menerima body yang sama dengan POST /question-imports dan memeriksanya tanpa menyimpan apa pun. Idempotency-Key tidak diperlukan. Validasi hanya memeriksa bentuk link gambar; gambar diunduh saat import diproses, sehingga link yang tidak dapat diakses baru terlihat sebagai image_download_failed pada import yang gagal.

Contoh request

Contoh response

Status 200 jika paket valid. Jika tidak valid, status 422 dengan format error di atas.
Memeriksa paket lalu memprosesnya di latar belakang. Jika ada kesalahan, respons 422 berisi seluruh error dan tidak ada yang disimpan. Jika valid, respons 202 dengan header Location ke GET /question-imports/{id}.Idempotency-Key wajib dikirim, maksimal 255 karakter ASCII tanpa spasi, misalnya {package_id}-r{revision}-{uuid}. Key berlaku 7 hari:
  • Key sama dan isi paket sama: import yang sudah ada dikembalikan dengan status 200 dan header Idempotent-Replayed: true. Aman dipakai saat koneksi terputus sebelum respons diterima.
  • Key sama dengan isi paket berbeda: ditolak 422 dengan kode idempotency_key_mismatch.
Revisi. Pasangan source.package_id dan source.revision hanya dapat menjadi paket soal satu kali per projek. Revisi yang sudah selesai diimport ditolak 409 (revision_already_imported). Import yang gagal tidak menghalangi pengiriman ulang revisi yang sama.

Parameter

Contoh request

Contoh response

Status 202.
Diurutkan dari import terbaru. Item daftar tidak memuat pemetaan ID; gunakan detail import untuk itu.

Parameter

Contoh request

Setelah status completed, respons berisi paket soal yang dibuat, stimuli (wacana) dan items (soal) dengan ID-nya di CBT. Simpan pemetaan ini untuk menelusuri soal Anda di CBT.

Parameter

Contoh request

Contoh response

Format paket

Tipe soal

Setiap opsi berisi id (unik di soal, maksimal 50 karakter), content (HTML) atau image, dan points opsional (default 0). answer_key dapat menyebut id sebagai string atau angka. points dipakai metode penilaian Akumulasi Skor Jawaban, sehingga nilai parsial dapat diatur per opsi. Contoh multiple_choice:
Contoh categorization (Fakta/Opini; untuk Benar/Salah cukup ganti kategorinya):
Kategori pertama tampil sebagai kolom kiri dan kategori kedua sebagai kolom kanan. Label kategori maksimal 50 karakter. Contoh short_answer dengan beberapa jawaban benar:
  • format: "numeric": kolom jawaban peserta hanya menerima angka, dan semua jawaban benar wajib berupa angka. format: "text": peserta mengetik teks bebas. Jika format tidak dikirim, soal memakai numeric bila semua jawaban benar berupa angka, selain itu text.
  • Dua angka dibandingkan berdasarkan nilainya (0,5 sama dengan 0.50); selain itu jawaban dibandingkan sebagai teks tanpa membedakan huruf besar/kecil dan spasi berlebih. Tidak ada toleransi angka; tulis setiap bentuk yang dianggap benar sebagai jawaban tersendiri. Setiap jawaban maksimal 255 karakter.
Contoh matching:

Konten dan media

  • HTML yang dipertahankan sama dengan editor soal di panel: b i em span p u strong table th tr td ul li ol br sup sub pre code untuk soal, wacana, dan pembahasan; opsi dan pernyataan hanya b i em span p strong ul li ol br sup sub pre code (tanpa garis bawah dan tabel). Tag lain dilepas (teksnya tetap ada); script, style, iframe, svg, dan sejenisnya dibuang beserta isinya; semua atribut dibuang kecuali colspan dan rowspan pada sel tabel. Konten yang berubah dilaporkan di warnings dengan kode content_sanitized.
  • Tulis karakter < dan > di dalam teks atau rumus sebagai &lt; dan &gt;, misalnya \(a &lt; b\). Karakter kontrol (selain tab dan baris baru) ditolak.
  • Rumus ditulis dalam LaTeX dengan pembatas \( ... \), \[ ... \], $ ... $, atau $$ ... $$.
  • Teks soal, opsi, pernyataan, dan pembahasan maksimal 5.000 karakter setelah tag dibuang.
  • Gambar di dalam teks tidak didukung dan dibuang. Kirim gambar soal lewat media.images dan gambar opsi lewat options.*.image.
  • Gambar dari link harus https, dapat diakses publik, dan berupa JPEG, PNG, GIF, atau WebP maksimal 5 MB. Gambar diunduh ke penyimpanan projek; link asli tidak disimpan dan tidak ditampilkan ke peserta. Link ke alamat jaringan internal, redirect lebih dari 3 kali, dan berkas yang isinya bukan gambar ditolak. Maksimal 300 link berbeda per paket.
  • Seluruh gambar dan audio dihitung dalam kuota penyimpanan projek.
Saat ujian, wacana tampil sebagai bagian dari setiap soal yang memakainya: gambar wacana tampil lebih dulu bersama gambar soal, lalu teks wacana tepat di atas teks soal. Jika soal diacak, soal-soal dengan wacana yang sama tetap berurutan.

Status import

Import yang gagal berisi error.code, error.message, error.retryable, dan error.details (daftar error per soal dengan format yang sama seperti Format error):
Jika retryable bernilai true, kirim ulang paket dengan Idempotency-Key baru. Jika false, perbaiki data sesuai details, lalu kirim ulang dengan Idempotency-Key baru.

Webhook

Daftarkan event question_import.completed dan question_import.failed lewat API Webhook. Header dan signature sama dengan event lain.
Pada question_import.failed, question_bank bernilai null dan error berisi penyebab kegagalan. Pemetaan ID lengkap dibaca lewat GET /question-imports/{id}.

Batas

  • 500 soal dan 100 wacana per paket; body maksimal 10 MB.
  • 20 import per jam per projek; satu import diproses dalam satu waktu, import lain menunggu di antrean.
  • Rate limit API 120 request per menit tetap berlaku.
  • Isi paket disimpan 30 hari setelah import selesai, lalu dihapus. Paket soal dan pemetaan ID tidak ikut dihapus.