Dokumentasi REST API Bersihin v1
Base URL: https://bersihin.deployroom.my.id
API ini bersifat publik, stateless, tanpa memerlukan API key atau autentikasi. Semua endpoint dilindungi oleh rate limiting dan header Cache-Control: no-store.
1. POST /api/v1/clean
Membersihkan metadata dari satu berkas gambar dan mengembalikan biner gambar yang bersih.
Content-Type: multipart/form-data
file(wajib): Berkas biner gambar (JPEG, PNG, atau WebP, maksimal 20 MB).keepIcc(opsional, boolean string, default"true"): Pertahankan profil warna ICC.keepOrientation(opsional, boolean string, default"true"): Pertahankan orientasi rotasi gambar.
Contoh Permintaan cURL:
curl -X POST "https://bersihin.deployroom.my.id/api/v1/clean" \
-F "file=@foto.jpg" \
-F "keepIcc=true" \
-F "keepOrientation=true" \
--output foto-clean.jpg
Header Respons:
Content-Type: Tipe MIME berkas gambar (image/jpeg,image/png, atauimage/webp).Content-Disposition: Nama file unduhan yang disanitasi (mis.attachment; filename="foto-clean.jpg").X-Bersihin-Report: Ringkasan JSON ter-encode Base64 yang berisi metadata apa saja yang dihapus dan dipertahankan.
2. POST /api/v1/inspect
Memeriksa keberadaan metadata dalam gambar tanpa memodifikasi isi berkas. Endpoint ini tidak pernah membocorkan koordinat GPS atau nilai teks metadata sebenarnya.
Contoh Permintaan cURL:
curl -X POST "https://bersihin.deployroom.my.id/api/v1/inspect" \
-F "file=@foto.jpg"
Contoh Respons JSON:
{
"format": "jpeg",
"width": 4032,
"height": 3024,
"found": ["EXIF", "GPS", "XMP", "C2PA"],
"details": {
"GPS": true,
"C2PA": true,
"EXIF": true,
"XMP": true
},
"bytes": 4821133
}
3. GET /api/v1/health
Pemeriksaan kesehatan sistem dan kesiapan mesin ExifTool.
curl "https://bersihin.deployroom.my.id/api/v1/health"
Respons: 200 OK {"status": "ok", "exiftool": "13.55"}
4. Kode Status & Format Error
Bila terjadi kegagalan, API mengembalikan respons JSON dengan format:
{
"success": false,
"error": {
"code": "KODE_ERROR",
"message": "Pesan deskripsi error yang ramah pengguna"
}
}
| HTTP | Kode Error | Keterangan |
|---|---|---|
| 400 | NO_FILE / CORRUPT_IMAGE |
Field file tidak disertakan atau file rusak/0 byte |
| 413 | FILE_TOO_LARGE / DIMENSIONS_TOO_LARGE |
Ukuran file melebihi 20 MB atau dimensi melebihi 100 MP |
| 415 | UNSUPPORTED_FORMAT |
Bukan format JPEG, PNG, atau WebP yang valid |
| 422 | VERIFICATION_FAILED |
Fail-closed: metadata terlarang masih tersisa setelah strip |
| 429 | RATE_LIMITED |
Batas laju permintaan tercapai (memuat header Retry-After) |
| 503 | BUSY |
Kapasitas antrean server penuh (memuat header Retry-After) |
| 500 | STRIP_FAILED |
Kegagalan internal proses pembersihan |