Mulai cepat
Tiga langkah untuk punya link CDN pertamamu.
Kirim file
POST ke /api/upload lewat multipart, link, atau base64.
Terima URL
Respons JSON berisi link /cdn/… yang siap dipakai.
Pakai di mana saja
Tempel di aplikasi, situs, atau chat — file langsung tersedia publik.
curl -X POST https://fileup.us.ci/api/upload \
-F "file=@/path/ke/foto.jpg"const form = new FormData();
form.append('file', fileInput.files[0]);
const res = await fetch('https://fileup.us.ci/api/upload', {
method: 'POST',
body: form,
});
const data = await res.json();
console.log(data.data.url);import requests
with open('foto.jpg', 'rb') as f:
res = requests.post(
'https://fileup.us.ci/api/upload',
files={'file': f},
)
print(res.json()['data']['url'])$ch = curl_init('https://fileup.us.ci/api/upload');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, [
'file' => new CURLFile('/path/ke/foto.jpg'),
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = json_decode(curl_exec($ch), true);
echo $data['data']['url'];Autentikasi
Upload dan ambil file tidak butuh API key — siapa saja bisa mengunggah dan mengakses file publik. Hanya endpoint hapus yang butuh API key, dikirim lewat header:
Authorization: Bearer API_KEY_KAMU
Atau memakai header alternatif X-API-Key: API_KEY_KAMU. Jika server tidak dikonfigurasi dengan API_KEY, endpoint hapus akan menolak semua request dengan status 403 DELETE_DISABLED.
Karena upload terbuka untuk publik, jangan letakkan data sensitif di nama file atau folder — semua file yang diunggah dapat diakses siapa pun yang tahu URL-nya.
Unggah file
https://fileup.us.ci/api/upload
Menerima file lewat empat cara sekaligus dalam satu endpoint — pilih yang paling cocok dengan aplikasimu. Alias /upload juga tersedia untuk kompatibilitas mundur.
Via file (multipart/form-data)
Cara paling umum: kirim file biner langsung. Nama field bebas — server membaca semua field bertipe file dari request, jadi file, image, upload, dsb semuanya diterima. Boleh lebih dari satu file sekaligus.
curl -X POST https://fileup.us.ci/api/upload \
-F "file=@/path/ke/foto.jpg" \
-F "folder=gambar/2026"
curl -X POST https://fileup.us.ci/api/upload \
-F "[email protected]" \
-F "[email protected]" \
-F "[email protected]"
Via link URL
Kirim satu atau beberapa URL sumber lewat field url / urls — server yang mengunduhkan file untukmu. Mendukung form-data, JSON array, maupun query string. Semua permintaan divalidasi agar tidak menyasar jaringan internal (proteksi SSRF).
curl -X POST https://fileup.us.ci/api/upload \
-d "url=https://contoh.com/gambar.png"
curl -X POST https://fileup.us.ci/api/upload \
-H "Content-Type: application/json" \
-d '{
"urls": ["https://contoh.com/a.png", "https://contoh.com/b.pdf"],
"folder": "impor"
}'
Via base64 / data URI
Cocok untuk aplikasi yang sudah punya file dalam bentuk base64 (mis. hasil canvas, screenshot dari ekstensi browser). Kirim lewat field base64 atau data, boleh berupa data URI lengkap (data:image/png;base64,…) atau string base64 polos + field mimetype.
curl -X POST https://fileup.us.ci/api/upload \
-H "Content-Type: application/json" \
-d '{
"data": "data:image/png;base64,iVBORw0KG...",
"filename": "capture.png"
}'
Via raw binary body
Kirim isi file langsung sebagai body request (tanpa multipart). Set Content-Type ke tipe file dan sebutkan nama file lewat query ?filename= atau header X-Filename.
curl -X POST "https://fileup.us.ci/api/upload?filename=foto.jpg" \
-H "Content-Type: image/jpeg" \
--data-binary @foto.jpg
Opsi tambahan
Field ini berlaku untuk keempat cara upload di atas, dikirim sebagai field form/JSON biasa atau query string:
| Field | Tipe | Keterangan |
|---|---|---|
folder | string | Subfolder tujuan, contoh gambar/2026. Dibuat otomatis bila belum ada. |
filename / name | string | Nama file kustom. Hanya berlaku jika request berisi tepat satu file. |
unique | boolean | Jika true/1, tambahkan kode acak pada nama file agar tidak pernah bentrok dengan file lama. |
Mengunggah beberapa file dengan nama yang sama dalam satu request otomatis diberi akhiran -1, -2, dst agar tidak saling menimpa.
Bentuk respons
Berhasil semua → 201. Sebagian berhasil → 207 dengan daftar errors. Semua gagal → status error dan success: false.
{
"success": true,
"message": "1 file berhasil diunggah.",
"data": {
"count": 1,
"url": "https://fileup.us.ci/cdn/gambar/2026/foto.jpg",
"files": [
{
"name": "foto.jpg",
"path": "gambar/2026/foto.jpg",
"url": "https://fileup.us.ci/cdn/gambar/2026/foto.jpg",
"size": 284213,
"mimetype": "image/jpeg",
"source": "upload"
}
]
}
}
{
"success": true,
"message": "1 file berhasil diunggah, 1 gagal.",
"data": { "count": 1, "url": "...", "files": [ { "...": "..." } ] },
"errors": [
{
"index": 1,
"source": "url",
"input": "https://contoh.com/rusak.png",
"code": "URL_FETCH_FAILED",
"message": "Server tujuan membalas HTTP 404."
}
]
}
Ambil file (CDN)
https://fileup.us.ci/cdn/{path}
Menyajikan file apa adanya (proxy ke penyimpanan) dengan Content-Type asli, cache 1 hari, dan header CORS terbuka. Mendukung permintaan Range untuk streaming video/audio.
Tambahkan ?download=1 untuk memaksa unduhan (Content-Disposition: attachment), atau ?download=nama-baru.pdf untuk mengunduh dengan nama file berbeda.
https://fileup.us.ci/cdn/gambar/2026/foto.jpg
https://fileup.us.ci/cdn/gambar/2026/foto.jpg?download=1
https://fileup.us.ci/cdn/dokumen/laporan.pdf?download=laporan-akhir.pdf
Hapus file
https://fileup.us.ci/api/delete
Butuh API key
Hapus satu atau banyak file sekaligus. Terima path/paths (path di penyimpanan) atau url/urls (link CDN penuh).
curl -X DELETE https://fileup.us.ci/api/delete \
-H "Authorization: Bearer API_KEY_KAMU" \
-H "Content-Type: application/json" \
-d '{ "path": "gambar/2026/foto.jpg" }'
curl -X DELETE https://fileup.us.ci/api/delete \
-H "Authorization: Bearer API_KEY_KAMU" \
-H "Content-Type: application/json" \
-d '{ "paths": ["a/1.jpg", "a/2.jpg"] }'
Respons sukses: 200 dengan daftar path yang dihapus. Tanpa API key yang valid, endpoint membalas 401 UNAUTHORIZED (atau 403 DELETE_DISABLED bila server belum mengaktifkan fitur ini).
Info & batas layanan
https://fileup.us.ci/api/info
Mengembalikan daftar endpoint dan batas layanan saat ini secara terprogram — berguna untuk memvalidasi ukuran file di sisi klien sebelum mengunggah.
| Batas | Nilai saat ini |
|---|---|
| Ukuran maksimal per file (upload langsung) | 4.5 MB |
| Ukuran maksimal per file (via link) | 4.5 MB |
| Jumlah file maksimal per request | 10 |
| Batas waktu unduh dari link | 15 detik |
| Rate limit | 60 request / 10 menit per IP |
| Endpoint hapus aktif | Tidak (API_KEY belum diset) |
Kode error
Semua error dibalas dalam bentuk konsisten: { "success": false, "error": { "code", "message" } }.
| Status | Kode | Arti |
|---|---|---|
| 400 | NO_FILE | Tidak ada file/url/base64 yang terdeteksi dalam request. |
| 400 | TOO_MANY_FILES | Jumlah file melebihi batas per request. |
| 400 | INVALID_URL / URL_NOT_ALLOWED | URL tidak valid, atau menyasar alamat internal/privat (diblokir demi keamanan). |
| 400 | INVALID_BASE64 | String base64 / data URI tidak valid. |
| 400 | INVALID_FOLDER / INVALID_PATH | Nama folder atau path tidak valid (terlalu dalam, atau mengandung ..). |
| 413 | FILE_TOO_LARGE | Ukuran file melebihi batas yang berlaku. |
| 401 | UNAUTHORIZED | API key untuk endpoint hapus tidak valid atau tidak dikirim. |
| 403 | DELETE_DISABLED | Server belum mengaktifkan fitur hapus (API_KEY kosong). |
| 404 | NOT_FOUND | Endpoint atau file tidak ditemukan. |
| 429 | RATE_LIMITED | Terlalu banyak request dari IP yang sama. Coba lagi setelah jeda. |
| 502 | URL_FETCH_FAILED / STORAGE_ERROR | Gagal mengunduh dari link sumber, atau gagal menyimpan ke penyimpanan. |
| 504 | URL_TIMEOUT | Server sumber tidak merespons dalam batas waktu yang ditentukan. |
| 500 | SERVER_NOT_CONFIGURED | Server belum dikonfigurasi dengan benar (variabel lingkungan penyimpanan kosong). |
Saat mengirim banyak file/link dalam satu request dan sebagian gagal, error per item muncul di array errors pada respons 207 — lihat contoh di bagian bentuk respons.
Rate limit
Setiap IP dibatasi 60 request per 10 menit untuk endpoint /api/upload dan /api/delete. Saat melewati batas, server membalas 429 RATE_LIMITED beserta header standar RateLimit yang menunjukkan sisa kuota.
Endpoint GET /cdn/{path} untuk mengambil file tidak dibatasi rate limit ini — aman dipakai sebagai sumber gambar/video di halaman publik.
FAQ
Apakah upload butuh akun atau API key?
Tidak. Upload dan pengambilan file bersifat publik dan tanpa autentikasi. Hanya endpoint hapus yang membutuhkan API key.
Format file apa saja yang didukung?
Semua jenis file diterima apa adanya — gambar, video, dokumen, arsip, dan lainnya — selama ukurannya tidak melebihi batas yang berlaku.
Kenapa upload via link ke localhost/IP privat ditolak?
Ini proteksi keamanan (anti-SSRF) agar fitur unduh-dari-link tidak disalahgunakan untuk mengakses jaringan internal server. Gunakan URL publik yang dapat diakses dari internet.
Bisakah nama file diganti setelah diunggah?
Belum ada endpoint rename. Untuk mengganti nama, unggah ulang dengan filename baru lalu hapus file lama lewat /api/delete.
Apakah ada batas berapa lama file disimpan?
Tidak ada batas waktu — file tersimpan permanen di penyimpanan dataset sampai dihapus secara manual lewat /api/delete.