Alur
- Siapkan media. Gambar dapat ditulis sebagai link
httpslangsung di paket, atau diunggah dulu kePOST /question-assetsuntuk mendapatkanasset_id. Audio hanya dapat dikirim lewat unggahan. - (Opsional) Periksa paket dengan
POST /question-imports/validate. - Kirim paket ke
POST /question-importsdengan headerIdempotency-Key. Paket diperiksa saat itu juga; jika valid, respons202dan paket diproses di latar belakang. - Pantau hasilnya lewat
GET /question-imports/{id}atau webhookquestion_import.completeddanquestion_import.failed. - Simpan
question_bank.iduntuk revisi tersebut danquestion_iduntuk setiap soal.
Format error
Endpoint pada halaman ini mengembalikanerrors 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
POST /question-assets — Mengunggah gambar atau audio
POST /question-assets — Mengunggah gambar atau audio
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.
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
Status201.POST /question-imports/validate — Memeriksa paket
POST /question-imports/validate — Memeriksa paket
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
Status200 jika paket valid. Jika tidak valid, status 422 dengan format error di atas.POST /question-imports — Mengirim paket
POST /question-imports — Mengirim paket
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
200dan headerIdempotent-Replayed: true. Aman dipakai saat koneksi terputus sebelum respons diterima. - Key sama dengan isi paket berbeda: ditolak
422dengan kodeidempotency_key_mismatch.
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
Status202.GET /question-imports — Daftar import
GET /question-imports — Daftar import
GET /question-imports/{id} — Status dan pemetaan ID
GET /question-imports/{id} — Status dan pemetaan ID
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:
categorization (Fakta/Opini; untuk Benar/Salah cukup ganti kategorinya):
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. Jikaformattidak dikirim, soal memakainumericbila semua jawaban benar berupa angka, selain itutext.- Dua angka dibandingkan berdasarkan nilainya (
0,5sama dengan0.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.
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 codeuntuk soal, wacana, dan pembahasan; opsi dan pernyataan hanyab 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 kecualicolspandanrowspanpada sel tabel. Konten yang berubah dilaporkan diwarningsdengan kodecontent_sanitized. - Tulis karakter
<dan>di dalam teks atau rumus sebagai<dan>, misalnya\(a < 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.imagesdan gambar opsi lewatoptions.*.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.
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 eventquestion_import.completed dan question_import.failed lewat API Webhook. Header dan signature sama dengan event lain.
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.

