malformed_json adalah kode error HTTP 400 pada Se-Hari API. Kami tidak berhasil mem-parse body request sebagai JSON. Ini terjadi sebelum validasi field, jadi tidak ada informasi tentang field mana yang bermasalah — parsernya berhenti lebih awal dari itu.
#Bentuk responsnya
Semua error Se-Hari memakai amplop yang sama. Yang perlu dicabang di kode Anda adalah code, bukan message — teks pesan bisa kami perbaiki sewaktu-waktu, sedangkan code adalah kontrak publik yang hanya berubah lewat versi API baru.
{
"error": {
"code": "malformed_json",
"message": "Contoh pesan untuk malformed_json.",
"docs_url": "https://se-hari.com/docs/error/malformed-json",
"request_id": "req_a1b2c3d4e5f6",
"details": {}
}
}#Kapan ini muncul
Kode ini muncul paling awal di rantai pemrosesan, bahkan sebelum kami tahu endpoint mana yang Anda tuju punya field apa. Karena itu responsnya tidak pernah menyebutkan field — parsernya berhenti sebelum sampai ke sana. Kalau Anda mengharapkan details.field dan mendapat objek kosong, kode inilah yang Anda terima, bukan invalid_request.
#Kenapa ini terjadi
- Koma berlebih sebelum kurung penutup — kesalahan paling umum, dan JavaScript memaafkannya sementara JSON tidak
- Tanda kutip tunggal alih-alih ganda
- Body kosong pada request yang mewajibkannya
- Shell memotong string karena tanda kutip tidak di-escape dengan benar
#Cara memperbaikinya
Validasi JSON Anda sebelum mengirim. Di shell, taruh body di antara tanda kutip tunggal dan pakai kutip ganda di dalamnya. Kalau body dibangun lewat kode, jangan menyusunnya dengan penggabungan string — pakai fungsi serialisasi bawaan bahasa Anda.
#Yang memicu error
curl -X POST "https://se-hari.com/api/v1/notes" \
-H "Authorization: Bearer $SEHARI_API_KEY" \
-H "Content-Type: application/json" \
-d "{'recording_id': 'abc',}"#Yang seharusnya
curl -X POST "https://se-hari.com/api/v1/notes" \
-H "Authorization: Bearer $SEHARI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"recording_id": "c0ffee00-1111-2222-3333-444455556666"}'#Aman diulang?
Percuma tanpa perubahan. Body-nya harus diperbaiki lebih dulu. Karena parser berhenti sebelum apa pun dikerjakan, tidak ada risiko duplikasi sama sekali pada percobaan berikutnya.
#Jangan tertukar dengan
Kalau JSON Anda berhasil di-parse tapi isinya salah, kodenya invalid_request dan details akan menyebutkan field yang bermasalah. Kalau Content-Type yang salah, kodenya unsupported_media_type — dan itu diperiksa sebelum parsing dimulai, jadi Anda tidak akan pernah menerima keduanya sekaligus.
#Mencegahnya terulang
Di shell, sebagian besar kasus ini berasal dari tanda kutip. Aturan praktisnya: bungkus seluruh JSON dengan kutip tunggal dan pakai kutip ganda di dalamnya, jangan sebaliknya. Kalau body-nya panjang, simpan ke berkas lalu kirim dengan -d @body.json — itu menghilangkan seluruh kelas kesalahan ini sekaligus membuat body-nya bisa divalidasi terpisah.
#Menangani ini di kode
Cabangkan pada error.code, dan bedakan kegagalan yang layak diulang dari yang tidak. Mengulang kegagalan yang tidak akan pernah berhasil hanya menghabiskan kuota rate limit — dan menyembunyikan kegagalan yang sebenarnya butuh perhatian Anda.
const res = await fetch('https://se-hari.com/api/v1/me', {
headers: { Authorization: `Bearer ${process.env.SEHARI_API_KEY}` }
});
if (!res.ok) {
const { error } = await res.json();
if (error.code === 'malformed_json') {
// Validasi JSON Anda sebelum mengirim. Di shell, taruh body di antara tanda kutip tunggal…
console.error(error.message, error.details);
}
// request_id adalah satu-satunya cara kami menemukan request ini di log.
console.error(`request_id: ${error.request_id}`);
}#Selanjutnya
- Semua kode error — daftar lengkap
- Autentikasi — scope dan siklus hidup API key
- Referensi API — error apa saja yang mungkin muncul di tiap endpoint