Beranda › Dokumentasi API

Dokumentasi API asliatauai

API deteksi foto & video AI untuk dipasang langsung ke aplikasi, ruang redaksi, atau sistem moderasi Anda. Alur sederhana: kirim berkas → dapat job_id → polling hasil.

Base URL: https://api.asliatauai.com
Autentikasi: header X-API-Key pada setiap permintaan.
Butuh API key? Hubungi halo@asliatauai.com.

1. Autentikasi

Setiap permintaan wajib menyertakan API key Anda di header. Permintaan tanpa key yang valid akan ditolak dengan 401.

X-API-Key: ak_xxxxxxxxxxxxxxxxxxxxxxxx

Jaga kerahasiaan key. Panggil API dari sisi server, jangan tanam di kode klien/browser publik.

2. Kirim berkas untuk dianalisis

POST /v1/analyze — unggah gambar/video sebagai multipart/form-data dengan field bernama file. Analisis berjalan asinkron, jadi endpoint langsung membalas 202 dengan job_id.

curl -X POST https://api.asliatauai.com/v1/analyze \
  -H "X-API-Key: ak_xxxxxxxxxxxxxxxxxxxxxxxx" \
  -F "file=@/path/ke/gambar.jpg"

Respons 202 Accepted:

{
  "job_id": "9f3a1c8e...",
  "content_sha256": "b1946ac9...",
  "status": "queued"
}

Batasan: ukuran berkas maksimal 200 MB, durasi video hingga 30 detik. Format didukung: gambar (JPG, PNG, WebP, HEIC) dan video (MP4, MOV, WebM). Berkas identik yang pernah dianalisis dapat langsung mengembalikan status: "done" (deduplikasi berdasarkan SHA-256).

3. Ambil hasil (polling)

GET /v1/result/{job_id} — panggil berkala hingga status menjadi done. Analisis gambar biasanya beberapa detik; video bisa lebih lama.

curl https://api.asliatauai.com/v1/result/9f3a1c8e... \
  -H "X-API-Key: ak_xxxxxxxxxxxxxxxxxxxxxxxx"

Saat selesai, status: "done" dan result berisi verdict:

{
  "job_id": "9f3a1c8e...",
  "status": "done",
  "kind": "image",
  "result": {
    "verdict": "likely-AI-generated",
    "score": 0.94,
    "confidence": "high",
    "kind": "image",
    "signals": [
      { "name": "ml_image", "score": 0.97, "weight": 2.4 },
      { "name": "forensics", "score": 0.61, "weight": 0.65 }
    ],
    "content_sha256": "b1946ac9...",
    "model_versions": {}
  }
}

Arti field result

FieldTipeKeterangan
verdictstringlikely-authentic, likely-AI-generated, likely-manipulated, atau inconclusive.
score0..1Semakin mendekati 1 = semakin condong sintetik/AI; mendekati 0 = asli.
confidencestringlow, medium, atau high.
kindstringimage atau video.
signalsarrayRincian per-detektor (nama, skor, bobot) untuk transparansi.

Status job

queuedprocessingdone. Jika terjadi kegagalan pemrosesan, status menjadi error dan field error berisi keterangan.

4. Penanganan error

Error dikembalikan dengan kode HTTP yang sesuai. Untuk error tervalidasi, body berbentuk { "detail": { "code": "...", "message": "..." } } atau { "detail": "..." }.

HTTPArtiCara menangani
401API key salah atau tidak ada (X-API-Key).Periksa header dan validitas key.
413Berkas melebihi batas ukuran (200 MB).Kompres/potong berkas sebelum kirim.
422Berkas ditolak (format tidak didukung, korup, atau video melebihi durasi). Body memuat code & message.Tampilkan message ke pengguna; kirim ulang berkas yang valid.
404job_id tidak ditemukan pada endpoint result.Pastikan job_id benar dan belum kedaluwarsa.
429Terlalu banyak permintaan (bila rate limit aktif).Terapkan backoff dan coba lagi nanti.
5xxGangguan sementara di server.Ulangi dengan exponential backoff (mis. 1s, 2s, 4s).

Praktik terbaik: polling dengan jeda (mis. 1–2 detik) dan batas percobaan; anggap status: "error" sebagai kegagalan job; jangan hard-fail hanya karena satu 5xx — ulangi dengan backoff.

5. Contoh lengkap (Python)

import time, requests

API = "https://api.asliatauai.com"
HEADERS = {"X-API-Key": "ak_xxxxxxxxxxxxxxxxxxxxxxxx"}

# 1) kirim berkas
with open("gambar.jpg", "rb") as f:
    r = requests.post(f"{API}/v1/analyze", headers=HEADERS, files={"file": f})
r.raise_for_status()
job = r.json()["job_id"]

# 2) polling hingga selesai
for _ in range(60):
    res = requests.get(f"{API}/v1/result/{job}", headers=HEADERS).json()
    if res["status"] == "done":
        print(res["result"]["verdict"], res["result"]["score"])
        break
    if res["status"] == "error":
        raise RuntimeError(res.get("error"))
    time.sleep(2)

6. Contoh (Node.js)

import fs from "fs";

const API = "https://api.asliatauai.com";
const H = { "X-API-Key": "ak_xxxxxxxxxxxxxxxxxxxxxxxx" };

const fd = new FormData();
fd.append("file", new Blob([fs.readFileSync("gambar.jpg")]), "gambar.jpg");
let r = await fetch(`${API}/v1/analyze`, { method: "POST", headers: H, body: fd });
if (!r.ok) throw new Error(`analyze ${r.status}`);
const { job_id } = await r.json();

for (let i = 0; i < 60; i++) {
  const res = await (await fetch(`${API}/v1/result/${job_id}`, { headers: H })).json();
  if (res.status === "done") { console.log(res.result.verdict, res.result.score); break; }
  if (res.status === "error") throw new Error(res.error);
  await new Promise(s => setTimeout(s, 2000));
}
Hasil API bersifat indikatif dan probabilistik, bukan alat bukti hukum. Tidak ada deteksi yang 100% akurat — gunakan sebagai sinyal, bukan keputusan mutlak.

Halaman terkait