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, atau image/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