Documentation

Public API untuk mengunggah file dan mendapatkan URL CDN. Gratis, tanpa autentikasi.

Overview

Base URL upload: https://uploads.saurusdev.cloud

Base URL CDN: https://cdn.saurusdev.cloud

Setiap file yang diunggah mendapat nama acak (2-10 karakter alfanumerik) dengan ekstensi asli dipertahankan, contoh: aYik6I.mp4. File dilayani lewat Cloudflare Worker yang mendukung HTTP Range Request penuh, sehingga audio/video bisa di-stream langsung (play, pause, seek) tanpa redirect atau paksa download.

Ada dua jalur upload: permanen (/api/upload) dan sementara dengan auto-hapus (/api/temp-upload) — lihat halaman /temp.

Upload Endpoint (Permanen)

POST /api/upload

Content-Type: multipart/form-data, field name: file

cURL

curl -X POST https://uploads.saurusdev.cloud/api/upload \
  -F "file=@/path/to/video.mp4"

JavaScript (fetch, browser)

const form = new FormData();
form.append('file', fileInput.files[0]);

const res = await fetch('https://uploads.saurusdev.cloud/api/upload', {
  method: 'POST',
  body: form
});
const data = await res.json();
console.log(data.url);

Node.js (CommonJS)

const fs = require('fs');
const FormData = require('form-data');
const fetch = require('node-fetch');

async function upload(filePath) {
  const form = new FormData();
  form.append('file', fs.createReadStream(filePath));

  const res = await fetch('https://uploads.saurusdev.cloud/api/upload', {
    method: 'POST',
    body: form,
    headers: form.getHeaders()
  });
  const data = await res.json();
  console.log(data);
}

upload('./video.mp4');

PHP

<?php
$curl = curl_init();
curl_setopt_array($curl, [
  CURLOPT_URL => 'https://uploads.saurusdev.cloud/api/upload',
  CURLOPT_POST => true,
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_POSTFIELDS => [
    'file' => new CURLFile('/path/to/video.mp4')
  ]
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;

Python

import requests

with open('video.mp4', 'rb') as f:
    res = requests.post(
        'https://uploads.saurusdev.cloud/api/upload',
        files={'file': f}
    )

print(res.json())

Response (200)

{
  "success": true,
  "filename": "aYik6I.mp4",
  "mime": "video/mp4",
  "size": 123456,
  "url": "https://cdn.saurusdev.cloud/aYik6I.mp4"
}

Upload Endpoint (Sementara / Auto-Hapus)

POST /api/temp-upload

Sama seperti upload permanen, tapi menerima field tambahan expiry dan file akan dihapus otomatis setelah waktu tersebut habis.

Nilai expiry yang valid

ValueDurasi
1h1 jam
5h5 jam
1d1 hari (default)
1mo1 bulan

cURL

curl -X POST https://uploads.saurusdev.cloud/api/temp-upload \
  -F "file=@/path/to/document.pdf" \
  -F "expiry=5h"

JavaScript (fetch, browser)

const form = new FormData();
form.append('file', fileInput.files[0]);
form.append('expiry', '1d'); // 1h | 5h | 1d | 1mo

const res = await fetch('https://uploads.saurusdev.cloud/api/temp-upload', {
  method: 'POST',
  body: form
});
const data = await res.json();
console.log(data.url, data.expiresAt);

Python

import requests

with open('document.pdf', 'rb') as f:
    res = requests.post(
        'https://uploads.saurusdev.cloud/api/temp-upload',
        files={'file': f},
        data={'expiry': '1d'}
    )

print(res.json())

Response (200)

{
  "success": true,
  "filename": "kR8xP2.pdf",
  "mime": "application/pdf",
  "size": 88213,
  "url": "https://cdn.saurusdev.cloud/kR8xP2.pdf",
  "temp": true,
  "expiresAt": "2026-09-20T09:00:00.000Z",
  "expiry": "1d"
}

Sebuah cron job berjalan setiap jam untuk memeriksa dan menghapus file yang sudah kedaluwarsa. Setelah dihapus, URL akan mengembalikan 404 NOT_FOUND.

Menggunakan CDN

URL yang dikembalikan (baik permanen maupun sementara) bisa langsung dipakai:

<img src="https://cdn.saurusdev.cloud/kR8xP2.webp" alt="image" />

<video controls src="https://cdn.saurusdev.cloud/aYik6I.mp4"></video>

<audio controls src="https://cdn.saurusdev.cloud/Zs.mp3"></audio>

File audio/video mendukung streaming penuh melalui HTTP Range Requests (206 Partial Content), sehingga player dapat melakukan seek tanpa mengunduh seluruh file terlebih dahulu.

Limits

  • Ukuran file maksimum: 25 MB (dapat berbeda, lihat header respons jika ditolak)
  • Rate limit: sekitar 10 request per menit per IP pada endpoint upload
  • Satu file per request (field file)
  • Gambar besar dapat dikompresi otomatis; video/audio besar tidak di-transcode
  • Upload sementara dibersihkan lewat cron per jam, bukan real-time ke detik

Error Codes

{
  "success": false,
  "error": "FILE_TOO_LARGE",
  "message": "File is too large for the current free storage system."
}
CodeStatusArti
NO_FILE400Tidak ada file terlampir
FILE_TOO_LARGE413Melebihi batas ukuran
INVALID_TYPE415Ekstensi/tipe tidak diizinkan
RATE_LIMITED429Terlalu banyak request
NOT_FOUND404File tidak ditemukan di CDN (atau sudah kedaluwarsa)
SERVICE_DISRUPTED503Gangguan sistem sementara

CORS

Endpoint upload mengizinkan permintaan lintas origin (Access-Control-Allow-Origin: * secara default). Preflight OPTIONS ditangani otomatis.

Keamanan

  • Nama file diacak; nama file asli tidak pernah dipakai sebagai path
  • Deteksi collision sebelum penyimpanan — file lama tidak pernah ditimpa
  • Validasi MIME dan ekstensi sebelum penyimpanan
  • GitHub token hanya digunakan di server, tidak pernah dikirim ke client
  • Pesan error tidak pernah menampilkan stack trace atau detail internal
  • Endpoint pembersihan cron dilindungi oleh secret terpisah (CRON_SECRET)