---
title: conflict — Bentrok dengan kondisi data saat ini
source: https://se-hari.com/docs/error/conflict
updated: 2026-08-15T22:09:54.462671+00:00
---

> HTTP 409. Permintaan Anda sah, tapi ada sesuatu yang sudah menempati posisi itu. Ini bukan kegagalan — di banyak kasus, `details` justru berisi id data…

`conflict` adalah kode error HTTP 409 pada Se-Hari API. Permintaan Anda sah, tapi ada sesuatu yang sudah menempati posisi itu. Ini bukan kegagalan — di banyak kasus, `details` justru berisi id data yang sebenarnya Anda cari.

## 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": "conflict",
    "message": "Contoh pesan untuk conflict.",
    "docs_url": "https://se-hari.com/docs/error/conflict",
    "request_id": "req_a1b2c3d4e5f6",
    "details": {
      "note_id": "c0ffee00-1111-2222-3333-444455556666"
    }
  }
}
```

## Kapan ini muncul

Kode ini paling sering bukan kegagalan, melainkan jawaban. Ketika sebuah workflow mengantre notulen untuk rekaman yang sudah punya notulen, yang sebenarnya diinginkan pemanggil hampir selalu adalah notulen yang sudah ada itu — dan `details` memuat id-nya. Memperlakukan 409 sebagai kesalahan fatal berarti membuang informasi yang sudah diberikan.

## Kenapa ini terjadi

- Rekaman sudah punya notulen; satu rekaman hanya boleh punya satu
- URL webhook yang sama sudah terdaftar untuk akun ini
- Batas jumlah endpoint webhook atau API key aktif sudah tercapai

## Cara memperbaikinya

Baca `details` sebelum memperlakukan ini sebagai error. Untuk `POST /notes`, `details.note_id` adalah notulen yang sudah ada untuk rekaman tersebut — biasanya itulah yang ingin Anda ambil, bukan membuat yang baru.

### Yang memicu error

```bash
# Mengantre ulang rekaman yang sudah punya notulen
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"}'
```

### Yang seharusnya

```bash
# Cari rekaman yang memang belum punya notulen
curl "https://se-hari.com/api/v1/recordings?has_note=false&limit=10" \
  -H "Authorization: Bearer $SEHARI_API_KEY"
```

## Aman diulang?

**Biasanya tidak perlu diulang sama sekali.** Baca `details` — di sana ada id data yang sudah menempati posisi itu, dan itu biasanya yang Anda cari. Mengulang hanya akan menghasilkan 409 yang sama.

## Jangan tertukar dengan

Bedanya dengan `idempotency_key_reused` — yang juga 409 — terletak pada penyebabnya: kode itu soal header `Idempotency-Key` yang dipakai untuk isi berbeda, sedangkan kode ini soal data yang memang sudah ada. Bedanya dengan `forbidden` juga tegas: 403 berarti operasinya tidak diizinkan sama sekali, 409 berarti operasinya sah tapi sudah pernah dilakukan.

## Mencegahnya terulang

Rancang alur Anda supaya menanyakan kondisi sebelum membuat: `GET /recordings?has_note=false` mengembalikan tepat rekaman yang belum diproses, sehingga 409 tidak pernah perlu terjadi. Untuk webhook, gunakan `GET /webhooks` sebelum mendaftarkan URL baru. Pola ini lebih murah daripada menangani konflik, dan jauh lebih mudah dibaca oleh orang yang mewarisi kode Anda.

## 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 === 'conflict') {
		// Baca `details` sebelum memperlakukan ini sebagai error. Untuk `POST /notes`…
		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