API ErrorAIAPIGeminiEnv7 mnt baca

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

error.log
// 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 detail

2 · 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)

before
// ❌ 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)

after
// ✔ 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

  1. Untuk 401: cek nama variabel env persis (GEMINI_API_KEY), pastikan .env.local ada dan server di-restart setelah menambahnya. Di Vercel, pasang di dashboard (Settings → Environment Variables) untuk Production sekaligus.
  2. 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.
  3. Jangan taruh key di client: pindahkan semua panggilan API AI ke API route / server action seperti contoh di atas.
  4. 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.