Mengatasi 401 dan 429 pada API AI (API key dan kuota)
Panggilan ke API AI gagal: 401 Unauthorized atau 429 quota exceeded. Bedakan keduanya dan perbaiki di tempat yang benar.
1 · Gejala & Log Pesan Error
// 401:
{"error": {"code": 401, "message": "API key not valid. Please pass a valid API key."}}
// 429:
{"error": {"code": 429, "message": "Quota exceeded for quota metric
'Generate Content API requests per minute'."}}
// kadang di console: "Failed to fetch" tanpa detail2 · Akar Penyebab Masalah
401 = Identitas Ditolak, 429 = Jatah Habis. Beda Obat.
401 Unauthorized berarti API key-mu salah, kedaluwarsa, atau tidak terkirim. Sering terjadi karena key disimpan di .env tapi nama variabelnya salah, file .env tidak ke-load, atau key-nya ke-revoke setelah tidak sengaja ter-publish.
429 Too Many Requests berarti key-nya valid tapi kamu melewati batas: request per menit, request per hari, atau kuota gratis habis. Ini bukan error kode, ini error volume.
Satu kesalahan arsitektur memperparah keduanya: memanggil API AI langsung dari browser. Selain key-nya terlihat siapa saja di DevTools (lalu disalahgunakan orang sampai kuotamu habis → 429 untukmu), kamu juga tidak bisa membatasi rate per user.
3 · Solusi & Diff Kode
✕ Sebelum (bermasalah)
// ❌ key di client: terlihat publik + tidak bisa rate-limit
"use client";
const res = await fetch(
"https://generativelanguage.googleapis.com/v1/models?key=AIzaSy...."
);✓ Sesudah (diperbaiki)
// ✔ panggil lewat API route server; key hanya di server
// app/api/tugas/route.ts
export async function POST(req: Request) {
const key = process.env.GEMINI_API_KEY; // tidak pernah ke browser
if (!key) throw new Error("GEMINI_API_KEY belum dipasang");
const res = await fetch(
"https://generativelanguage.googleapis.com/v1/models/gemini-2.5-flash:generateContent?key=" + key,
{ method: "POST", body: JSON.stringify(await req.json()) }
);
return Response.json(await res.json());
}Langkah Perbaikan
- Untuk 401: cek nama variabel env persis (
GEMINI_API_KEY), pastikan.env.localada dan server di-restart setelah menambahnya. Di Vercel, pasang di dashboard (Settings → Environment Variables) untuk Production sekaligus. - Untuk 429: kurangi frekuensi (debounce input user, cache respons yang sama), atau naikkan kuota di console provider. Cek dashboard pemakaian untuk memastikan bukan key-mu yang dipakai orang lain.
- Jangan taruh key di client: pindahkan semua panggilan API AI ke API route / server action seperti contoh di atas.
- Rotasi key yang bocor: kalau key pernah ter-commit ke git atau terlihat di screenshot, revoke di console provider dan buat yang baru. Key yang bocor = tagihan orang lain atas namamu.