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.
https://api.asliatauai.comAutentikasi: 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
| Field | Tipe | Keterangan |
|---|---|---|
verdict | string | likely-authentic, likely-AI-generated, likely-manipulated, atau inconclusive. |
score | 0..1 | Semakin mendekati 1 = semakin condong sintetik/AI; mendekati 0 = asli. |
confidence | string | low, medium, atau high. |
kind | string | image atau video. |
signals | array | Rincian per-detektor (nama, skor, bobot) untuk transparansi. |
Status job
queued → processing → done. 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": "..." }.
| HTTP | Arti | Cara menangani |
|---|---|---|
401 | API key salah atau tidak ada (X-API-Key). | Periksa header dan validitas key. |
413 | Berkas melebihi batas ukuran (200 MB). | Kompres/potong berkas sebelum kirim. |
422 | Berkas ditolak (format tidak didukung, korup, atau video melebihi durasi). Body memuat code & message. | Tampilkan message ke pengguna; kirim ulang berkas yang valid. |
404 | job_id tidak ditemukan pada endpoint result. | Pastikan job_id benar dan belum kedaluwarsa. |
429 | Terlalu banyak permintaan (bila rate limit aktif). | Terapkan backoff dan coba lagi nanti. |
5xx | Gangguan 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));
}