Skip to main content
Dokumentasi
Pusat Pembelajaran

Kuasai moderasi konten dengan panduan lengkap, tutorial, dan dokumentasi API

Tautan Cepat

Kode Error dan Respons

Discuse API memberi sinyal adanya masalah dengan dua cara: status error HTTP disertai message, atau respons normal 200 yang field-nya menjelaskan apa yang terjadi. Halaman ini mencantumkan setiap kasus agar Anda dapat menanganinya dengan benar — sekaligus menjelaskan satu hal yang sering membingungkan: habisnya kuota penagihan bukan error HTTP.

Status HTTP apa saja yang dikembalikan API?

Status Kapan Yang harus dilakukan
200 Berhasil — termasuk kasus "kuota habis" Periksa isi respons; 200 tidak selalu berarti semuanya aman (lihat di bawah)
400 Validasi permintaan gagal — konten kosong, text lebih dari 10.000 karakter, atau URL media terlalu banyak Perbaiki permintaan; jangan mencoba ulang tanpa perubahan
401 API key tidak ada atau tidak valid Periksa header X-API-Key; jangan mencoba ulang tanpa perubahan
429 Batas laju untuk key terlampaui Tunggu lalu coba lagi setelah jendela satu menit
500 Error downstream/internal Coba lagi dengan backoff

Baca message pada respons non-2xx apa pun. Kegagalan autentikasi mengembalikan 401, kegagalan batas laju mengembalikan 429, dan kegagalan validasi permintaan mengembalikan 400; perlakukan 5xx sebagai sementara dan coba lagi dengan backoff.

Mengapa "kuota habis" berupa 200, bukan error?

Saat sebuah proyek menghabiskan jatah permintaan API bulanannya, POST /api/v2/check tetap mengembalikan 200 — dengan konten diperlakukan seolah tidak memiliki pelanggaran, sebuah message yang menjelaskan bahwa kuota telah habis, dan objek usage yang menunjukkan sisa nol:

{
  "has_violations": false,
  "message": "API quota exceeded. Current: 10000, Limit: 10000",
  "usage": {
    "api_requests_used": 10000,
    "api_requests_limit": 10000,
    "api_requests_remaining": 0
  }
}

Ini disengaja: habisnya kuota tidak seharusnya terlihat seperti kegagalan server atau memblokir pipeline Anda dengan exception. Periksa usage.api_requests_remaining (dan message), bukan hanya mengandalkan kode status. Jika Anda membiarkan lolos pada 200, kuota yang habis akan diam-diam membuat konten lewat tanpa diperiksa — jadi buat percabangan secara eksplisit berdasarkan field-field ini.

Bagaimana cara membaca respons yang berhasil?

Respons 200 dari /api/v2/check selalu membawa has_violations dan cached; sisanya opsional:

Field Tipe Arti
has_violations boolean True jika pemeriksaan yang diaktifkan menandai konten
cached boolean True jika disajikan dari cache permintaan identik terbaru
message string Ada saat kuota habis (dan pemberitahuan non-error serupa)
request_id string Dikembalikan jika Anda mengirimkannya
processing_time_ms number Ada saat pengukuran waktu diaktifkan untuk proyek
usage object api_requests_used, api_requests_limit, api_requests_remaining
results object Detail per pemeriksaan (spamfinder, sentiment, images, …) dan flag tingkat atas hits

Gunakan has_violations untuk keputusan keseluruhan, lalu telusuri results.<check>.hit untuk mengetahui pemeriksaan mana yang terpicu.

Bagaimana caching memengaruhi respons?

Permintaan identik untuk proyek yang sama akan di-deduplikasi: pengulangan mengembalikan cached: true dengan hasil yang sama. Caching berlaku per proyek. Perlu diperhatikan bahwa permintaan yang di-cache tetap dihitung terhadap kuota permintaan API Anda — caching menghemat waktu pemrosesan, bukan kuota.

Anda dapat menyertakan request_id pada permintaan untuk korelasi internal Anda; nilai tersebut akan dikembalikan dalam respons.

Klien minimal yang benar

async function check(content, settings) {
  const response = await fetch('https://api.discuse.com/api/v2/check', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-API-Key': process.env.DISCUSE_API_KEY
    },
    body: JSON.stringify({ content, settings })
  });

  // 400: bad request — fix it, don't retry. 5xx: transient/auth/rate-limit — retry with backoff.
  if (response.status === 400) {
    throw new Error('Invalid request: ' + (await response.text()));
  }
  if (!response.ok) {
    throw new Error(`Discuse error ${response.status}`); // retry upstream with backoff
  }

  const data = await response.json();

  // Quota exhausted is a 200 — never treat it as "checked and clean".
  if (data.usage && data.usage.api_requests_remaining === 0 && data.message) {
    throw new Error('Quota exhausted: ' + data.message);
  }

  return data; // inspect data.has_violations and data.results
}

Terkait

Ditulis oleh Tim Discuse · Terakhir diperbarui June 2026

Artikel Terkait

Apa Itu Moderasi Konten?

Memahami dasar-dasar moderasi konten dan mengapa hal ini penting untuk platform Anda

Panduan Mulai Cepat

Mulai menggunakan Discuse API dalam waktu kurang dari 5 menit

Autentikasi dan Kunci API

Cara mengautentikasi permintaan dan mengelola kunci API Anda dengan aman