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.
{
"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 dan periksa statusnya — key yang dicabut tetap tampil di daftar dengan label "Dicabut" supaya Anda tahu ia pernah ada.
#Yang memicu error
# Panjang tidak sesuai = key terpotong saat disalin
echo -n "$SEHARI_API_KEY" | wc -c
# 43 ← salah, harusnya 51#Yang seharusnya
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.
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 — daftar lengkap
- Autentikasi — scope dan siklus hidup API key
- Referensi API — error apa saja yang mungkin muncul di tiap endpoint