DanimaruCloud

API Documentation

Gunakan token untuk mengakses API. Jika token salah, hubungi admin via WhatsApp Channel.

v1 JSON Multipart
https://cdn.danimaru.site
AUTH

Authentication & Token

Kirim token pada header berikut:

Authorization: Bearer <token>
X-API-Key: <token>

Format token contoh: nama-4digit (mis. dani-4821).

POST

/upload

Body (multipart/form-data)

Parameter Tipe Keterangan
fileFileWajib. Isi chunk saat ini (atau file utuh untuk single-part).
chunkIndexintIndex chunk (0-based). Gunakan 0 untuk single-part.
totalChunksintTotal chunk. Gunakan 1 untuk single-part.
fileIdstringID unik yang sama untuk semua chunk (mis. UUID).
originalNamestringOpsional. Nama asli file.

Server memvalidasi MIME/EXT, memblokir skrip berbahaya, lalu menghasilkan URL pendek.

Contoh single & chunked
curl -X POST "https://cdn.danimaru.site/upload" \
  -H "Authorization: Bearer <TOKEN>" \
  -F "file=@/path/to/file.jpg" \
  -F "chunkIndex=0" -F "totalChunks=1" \
  -F "fileId=$(date +%s)" \
  -F "originalName=file.jpg"
# Ulangi 0..N-1
for i in $(seq 0 3); do
  curl -X POST "https://cdn.danimaru.site/upload" \
    -H "Authorization: Bearer <TOKEN>" \
    -F "file=@/tmp/chunk-$i.bin" \
    -F "chunkIndex=$i" -F "totalChunks=4" \
    -F "fileId=my-big-file-uuid" \
    -F "originalName=video.mp4"
done
const TOKEN = '<TOKEN>';
const CHUNK = 20 * 1024 * 1024; // 20MB
async function upload(file){
  const total = Math.ceil(file.size / CHUNK);
  const fileId = (Date.now().toString(36)+Math.random().toString(36).slice(2)).slice(0,16);
  for(let i=0;i<total;i++){
    const part = file.slice(i*CHUNK, Math.min(file.size,(i+1)*CHUNK));
    const fd = new FormData();
    fd.append('file', part, file.name + '.part');
    fd.append('chunkIndex', i);
    fd.append('totalChunks', total);
    fd.append('fileId', fileId);
    fd.append('originalName', file.name);
    const res = await fetch('https://cdn.danimaru.site/upload', {
      method:'POST', headers:{ 'Authorization':'Bearer '+TOKEN }, body: fd
    });
    const json = await res.json();
    if(json.status==='success'){ return json.data; }
  }
}
const fd = new FormData();
fd.append('file', file);
fd.append('chunkIndex', 0);
fd.append('totalChunks', 1);
fd.append('fileId', Date.now().toString(36));
fd.append('originalName', file.name);
const res = await fetch('https://cdn.danimaru.site/upload', {
  method:'POST', headers:{ 'Authorization':'Bearer <TOKEN>' }, body: fd
});
const json = await res.json();
console.log(json.data?.url);
$ch = curl_init('https://cdn.danimaru.site/upload');
$data = [
  'file' => new CURLFile('/path/to/file.jpg'),
  'chunkIndex' => 0,
  'totalChunks' => 1,
  'fileId' => 'abc123',
  'originalName' => 'file.jpg'
];
curl_setopt_array($ch, [
  CURLOPT_POST => 1,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer <TOKEN>'],
  CURLOPT_POSTFIELDS => $data,
  CURLOPT_RETURNTRANSFER => 1
]);
$out = curl_exec($ch); curl_close($ch);
echo $out;

Response (Sukses)

{
  "status": "success",
  "creator": "Danimaru",
  "data": {
    "filename": "a1b2c3d4.png",
    "original": "foto.png",
    "type": "image",
    "size": "1.2 MB",
    "mime": "image/png",
    "short_url": "https://cdn.danimaru.site/s/Ab12CdE",
    "view_url":  "https://cdn.danimaru.site/f/Ab12CdE",
    "url":       "https://cdn.danimaru.site/f/Ab12CdE"
  }
}

Response (Progress Chunk)

{
  "status": "chunk_uploaded",
  "chunkIndex": 2
}
GET

/dl?t=<TOKEN>

Proxy streaming ke Cloudflare R2 (opsional). URL R2 asli tidak tampil di address bar.

  • Default: inline untuk image/*, video/*, audio/*, text/*, application/pdf.
  • Tambah &d=1 untuk memaksa unduh.
POST

/api/shorten

Body

  • url (required) — http(s) target
  • code (optional) — custom code [a-zA-Z0-9_-] 3–32

Contoh cURL

curl -X POST "https://cdn.danimaru.site/api/shorten" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/halaman"}'

Response

{
  "status": "success",
  "code": "AbC1234",
  "short_url": "https://cdn.danimaru.site/s/AbC1234",
  "long_url": "https://example.com/halaman"
}

Redirect

GET https://cdn.danimaru.site/s/AbC1234  → 302 → https://example.com/halaman
GET

/api/info?code=<CODE>

Contoh

curl "https://cdn.danimaru.site/api/info?code=AbC1234"

Response

{
  "status": "success",
  "data": {
    "code": "AbC1234",
    "long_url": "https://example.com/halaman",
    "clicks": 12,
    "created_at": "2025-08-27 05:55:11",
    "short_url": "https://cdn.danimaru.site/s/AbC1234"
  }
}
JSON

Error Format

Unauthorized

{
  "status": "error",
  "message": "Unauthorized: Token kosong atau tidak dikirim."
}

Lainnya

{
  "status": "error",
  "message": "Method not allowed"
}
{
  "status": "error",
  "message": "Chunk too large (max 20MB)"
}
{
  "status": "error",
  "message": "Type not allowed (mime: '...', ext: '...')"
}
INFO

Rate Limits & Quota

  • Token bucket: contoh 60 request / 30 detik per token (konfigurasi server).
  • Daily quota: contoh 1000 request / hari per token (bisa diubah di panel).