---
title: malformed_json — Body bukan JSON yang valid
source: https://se-hari.com/docs/error/malformed-json
updated: 2026-08-15T22:09:53.552525+00:00
---

> HTTP 400. Kami tidak berhasil mem-parse body request sebagai JSON. Ini terjadi sebelum validasi field, jadi tidak ada informasi tentang field mana yang…

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

```json
{
  "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

```bash
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

```bash
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.

```javascript
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](/docs/error) — daftar lengkap
- [Autentikasi](/docs/autentikasi) — scope dan siklus hidup API key
- [Referensi API](/docs/api) — error apa saja yang mungkin muncul di tiap endpoint