---
title: invalid_api_key — API key ditolak
source: https://se-hari.com/docs/error/invalid-api-key
updated: 2026-08-15T22:09:53.749922+00:00
---

> HTTP 401. Header `Authorization` ada, tapi key di dalamnya tidak kami kenali, sudah dicabut, atau sudah lewat masa berlakunya. Ketiga kondisi itu sengaja…

`invalid_api_key` adalah kode error HTTP 401 pada Se-Hari API. Header `Authorization` ada, tapi key di dalamnya tidak kami kenali, sudah dicabut, atau sudah lewat masa berlakunya. Ketiga kondisi itu sengaja dijawab dengan pesan yang sama persis — membedakannya akan memberi tahu penyerang mana tebakan yang "hampir benar".

## 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": "invalid_api_key",
    "message": "Contoh pesan untuk invalid_api_key.",
    "docs_url": "https://se-hari.com/docs/error/invalid-api-key",
    "request_id": "req_a1b2c3d4e5f6",
    "details": {}
  }
}
```

## Kapan ini muncul

Kode ini tidak membedakan key yang salah, dicabut, dan kedaluwarsa — dan itu keputusan yang disengaja. Membedakannya akan memberi tahu penyerang bahwa sebuah tebakan sudah mendekati bentuk key yang sah, yang mempersempit ruang pencarian mereka secara signifikan. Konsekuensinya bagi Anda: pesan errornya tidak akan menunjukkan mana dari ketiganya yang terjadi, dan dashboard adalah tempat yang tepat untuk mencari tahu.

## Kenapa ini terjadi

- Key tersalin sebagian. Panjangnya tetap: `sh_live_` diikuti 43 karakter
- Key sudah dicabut lewat dashboard
- Key punya tanggal kedaluwarsa yang sudah lewat
- Spasi atau baris baru ikut tersalin, biasanya dari copy-paste multi-baris
- Key milik akun lain — misalnya key staging dipakai di produksi

## Cara memperbaikinya

Hitung panjang key Anda; kalau bukan 51 karakter, penyalinannya yang bermasalah. Kalau panjangnya benar, buka [dashboard developer](/dashboard/developer) dan periksa statusnya — key yang dicabut tetap tampil di daftar dengan label "Dicabut" supaya Anda tahu ia pernah ada.

### Yang memicu error

```bash
# Panjang tidak sesuai = key terpotong saat disalin
echo -n "$SEHARI_API_KEY" | wc -c
# 43   ← salah, harusnya 51
```

### Yang seharusnya

```bash
echo -n "$SEHARI_API_KEY" | wc -c
# 51   ← benar

curl "https://se-hari.com/api/v1/me" -H "Authorization: Bearer $SEHARI_API_KEY"
```

## Aman diulang?

**Percuma tanpa perubahan.** Key yang ditolak akan ditolak lagi. Ganti key-nya dulu. Retry otomatis pada kode ini adalah pemborosan murni dan sering menjadi penyebab akun menyentuh 429 pada saat yang paling tidak tepat.

## Jangan tertukar dengan

Kode ini berarti kami tidak bisa memastikan siapa Anda. `insufficient_scope` berarti sebaliknya: kami tahu persis siapa Anda, tapi Anda tidak berhak melakukan operasi itu. Urutannya menentukan — pemeriksaan scope hanya berjalan setelah key berhasil dikenali, jadi 403 justru membuktikan key Anda sah.

## Mencegahnya terulang

Beri setiap integrasi API key sendiri. Dengan begitu, key yang dicabut hanya mematikan satu integrasi, dan Anda bisa langsung tahu integrasi mana yang bermasalah dari nama key-nya di log aktivitas. Key bersama yang dipakai lima sistem berarti setiap pencabutan adalah insiden, dan setiap error 401 butuh penyelidikan untuk tahu siapa yang terdampak.

## 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 === 'invalid_api_key') {
		// Hitung panjang key Anda; kalau bukan 51 karakter, penyalinannya yang bermasalah. Kalau…
		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