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
| Value | Durasi |
|---|---|
1h | 1 jam |
5h | 5 jam |
1d | 1 hari (default) |
1mo | 1 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."
}| Code | Status | Arti |
|---|---|---|
| NO_FILE | 400 | Tidak ada file terlampir |
| FILE_TOO_LARGE | 413 | Melebihi batas ukuran |
| INVALID_TYPE | 415 | Ekstensi/tipe tidak diizinkan |
| RATE_LIMITED | 429 | Terlalu banyak request |
| NOT_FOUND | 404 | File tidak ditemukan di CDN (atau sudah kedaluwarsa) |
| SERVICE_DISRUPTED | 503 | Gangguan 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)
