Dapur API
Sumber konten streaming untuk Warung kamu. Semua konten — video, album, search, trending — diambil dari sini lewat HTTP request pakai API key.
🚀 Quickstart #
Dari nol ke response pertama dalam 5 menit.
Ambil API Key
Login ke panel.dukunseo.com, masuk ke menu API Keys, klik Generate Key Baru. Salin key-nya — hanya tampil sekali.
Panggil Endpoint Pertama
Kirim GET request ke endpoint /api/v1/media dengan dua header wajib.
Terima Konten
Response JSON berisi list konten siap pakai. Tampilkan di situs kamu.
curl https://dapur.dukunseo.com/api/v1/media \
-H "X-API-Key: usr123_sk_live_xxxxxxxxxxxx" \
-H "Origin: https://situslo.com"
const res = await fetch('https://dapur.dukunseo.com/api/v1/media', {
headers: {
'X-API-Key': 'usr123_sk_live_xxxxxxxxxxxx',
'Origin': 'https://situslo.com'
}
});
const data = await res.json();
console.log(data.data); // array of media items
{
"status": "ok",
"data": [
{
"id": 1842,
"title": "Judul Konten",
"type": "video",
"thumbnail": "https://cdn.../thumb.jpg",
"duration": 482,
"views": 15280,
"tags": ["viral", "terbaru"],
"created_at":"2026-03-10T14:22:00+07:00"
}
],
"meta": {
"total": 1523,
"page": 1,
"per_page": 24,
"total_pages": 64,
"has_next": true,
"has_prev": false
}
}
🔑 Autentikasi #
Semua request wajib menyertakan dua header berikut.
| Header | Wajib | Keterangan |
|---|---|---|
| X-API-Key | WAJIB | API key dari panel. Format: usr{id}_sk_live_{hash} |
| Origin | WAJIB | Domain situs yang terdaftar di whitelist panel. Contoh: https://situslo.com |
| Accept | OPSIONAL | Defaultnya application/json. Tidak perlu dicantumkan eksplisit. |
X-API-Key: usr42_sk_live_a3f9c2e1b8d74f5a
Origin: https://warungku.com
Accept: application/json
🌐 Base URL #
Semua endpoint diawali dengan base URL berikut.
https://dapur.dukunseo.com/api/v1
📡 Endpoints
Semua endpoint menggunakan HTTPS. Response selalu JSON.
Ambil daftar konten (video atau album) dengan pagination. Endpoint utama untuk halaman beranda, halaman kategori, dan halaman tag.
| Parameter | Tipe | Default | Keterangan |
|---|---|---|---|
| page | integer | 1 | Nomor halaman |
| per_page | integer | 24 | Jumlah item per halaman. Maks 100. |
| type | string | — | Filter tipe: video atau album. Kosong = semua. |
| sort | string | newest | newest · popular · views · longest |
GET /api/v1/media?page=1&per_page=24&type=video&sort=newest
{ "status":"ok", "data":[{...}], "meta":{"total":1440,"page":1,"per_page":24,"total_pages":60,"has_next":true,"has_prev":false}}}
Ambil detail lengkap satu konten berdasarkan ID. Dipakai di halaman tonton/view.
GET /api/v1/media/1842
{
"status": "ok",
"data": {
"id": 1842,
"title": "Judul Konten",
"type": "video",
"description":"Deskripsi konten...",
"thumbnail": "https://cdn.../thumb.jpg",
"duration": 482, // detik
"views": 15280,
"tags": ["viral", "terbaru"],
"status": "published",
"created_at": "2026-03-10T14:22:00+07:00",
"updated_at": "2026-03-12T09:10:00+07:00"
}
}
Ambil konten paling populer saat ini. Dipakai di strip trending dan filter "Terpopuler".
| Parameter | Tipe | Default | Keterangan |
|---|---|---|---|
| limit | integer | 20 | Jumlah item. Maks 100. |
| type | string | — | video atau album. Kosong = semua. |
GET /api/v1/trending?limit=10&type=video
Ambil konten berdasarkan skor popularitas gabungan: views, likes (3×), bonus konten baru ≤7 hari (2×), dan bonus video >10 menit (1.5×).
| Parameter | Tipe | Default | Keterangan |
|---|---|---|---|
| limit | integer | 20 | Jumlah item. Maks 100. |
| type | string | — | video atau album. Kosong = semua. |
GET /api/v1/popular?limit=10
Ambil konten yang paling banyak ditonton. Diurutkan murni berdasarkan jumlah views.
| Parameter | Tipe | Default | Keterangan |
|---|---|---|---|
| limit | integer | 20 | Jumlah item. Maks 100. |
| type | string | — | video atau album. Kosong = semua. |
GET /api/v1/most-viewed?limit=10
Ambil konten yang paling banyak dilike. Diurutkan murni berdasarkan jumlah likes.
| Parameter | Tipe | Default | Keterangan |
|---|---|---|---|
| limit | integer | 20 | Jumlah item. Maks 100. |
| type | string | — | video atau album. Kosong = semua. |
GET /api/v1/most-liked?limit=10
Ambil video dengan durasi terpanjang. Hanya mengembalikan tipe video — album tidak punya durasi.
| Parameter | Tipe | Default | Keterangan |
|---|---|---|---|
| limit | integer | 20 | Jumlah item. Maks 100. |
GET /api/v1/longest?limit=10
Cari konten berdasarkan kata kunci. Query minimal 2 karakter. Hasil sudah dipaginasi.
| Parameter | Tipe | Default | Keterangan |
|---|---|---|---|
| q | string | — | WAJIB Kata kunci pencarian. Min 2 karakter. |
| page | integer | 1 | Nomor halaman |
| per_page | integer | 24 | Jumlah item per halaman |
| type | string | — | Filter tipe konten |
| search_in | string | — | Cari di field tertentu: tags |
GET /api/v1/search?q=viral&page=1&per_page=24
Ambil detail album beserta seluruh list foto di dalamnya. Dipakai di halaman galeri album.
GET /api/v1/album/321
{
"status": "ok",
"data": {
"id": 321,
"title": "Judul Album",
"type": "album",
"photo_count": 24,
"photos": [
{ "url": "https://cdn.../foto-1.jpg" },
{ "url": "https://cdn.../foto-2.jpg" }
]
}
}
Ambil daftar tag yang paling banyak dipakai. Dipakai di tag cloud dan navigasi.
| Parameter | Tipe | Default | Keterangan |
|---|---|---|---|
| limit | integer | 100 | Jumlah tag yang dikembalikan. |
GET /api/v1/tags?limit=50
{ "status":"ok", "data":["viral","terbaru","hot","hd"] }
Ambil semua konten yang memiliki tag tertentu. Dipakai di halaman /tag/{tag}.
| Parameter | Tipe | Default | Keterangan |
|---|---|---|---|
| page | integer | 1 | Nomor halaman |
| per_page | integer | 24 | Jumlah item per halaman. Maks 100. |
GET /api/v1/tags-media/viral?page=1&per_page=24
Ambil semua kategori konten yang tersedia. Dipakai di menu navigasi dan filter.
GET /api/v1/categories
{
"status": "ok",
"data": [
{ "type": "video", "label": "Video", "count": 1200 },
{ "type": "album", "label": "Album", "count": 323 }
]
}
Ambil URL embed player untuk satu konten video. URL ini yang dimasukkan ke dalam <iframe> di halaman tonton.
GET /api/v1/player-url/1842
{ "status":"ok", "data":{ "player_url":"https://player.example.com/embed/abc123" } }
Ambil URL download langsung untuk konten video atau foto album. Dipakai di halaman /download/{id}.
GET /api/v1/download-url/1842
{ "status":"ok", "data":{ "download_url":"https://cdn.../file.mp4?dl=1" } }
Ambil konfigurasi warung dari Dapur — tipe konten aktif, nav items, dan fitur yang tersedia. Template otomatis memanggil ini saat boot, lo tidak perlu panggil manual.
{
"status": "ok",
"data": {
"warung_type": "C", // A=video, B=album, C=keduanya
"content_types": ["video","album"],
"nav_items": [{"label":"Video","type":"video"}],
"features": {"has_album_route":true}
}
}
Tambahkan satu view ke konten. Dipanggil di background saat pengunjung membuka halaman tonton. Kalau lo pakai Warung Template, sudah otomatis dipanggil — tidak perlu manual.
POST /api/v1/record-view/1842
# Tidak perlu body — ID cukup dari URL
Tambahkan satu like ke konten. Dipanggil saat pengunjung menekan tombol like. Anti-duplicate per IP — like dari IP yang sama dalam satu sesi diabaikan.
POST /api/v1/record-like/1842
# Tidak perlu body — ID cukup dari URL
{ "status":"ok", "data":{"likes":284,"liked":true} }
Kirim berapa detik pengunjung menonton video. Dipakai untuk statistik watch time. Anti-cheat: nilai tidak boleh melebihi 2× durasi video.
| Parameter (Body JSON) | Tipe | Keterangan |
|---|---|---|
| seconds | integer | WAJIB Durasi tonton dalam detik. |
POST /api/v1/record-watch-time/1842
Content-Type: application/json
{ "seconds": 240 }
Cek sisa kuota request bulan berjalan untuk API key yang sedang dipakai.
{
"status": "ok",
"data": {
"plan": "pro",
"monthly_quota": 600000,
"monthly_used": 12480,
"monthly_left": 587520,
"reset_at": "2026-04-01T00:00:00+07:00"
}
}
Ambil statistik agregat warung: total views, likes, watch time, dan jumlah konten aktif.
{
"status": "ok",
"data": {
"total_media": 1523,
"total_views": 4820910,
"total_likes": 182340,
"total_watch_time": 98432100 // total detik
}
}
Ambil konfigurasi slot iklan yang aktif untuk warung ini. Template otomatis memanggil ini saat boot — lo tidak perlu panggil manual.
GET /api/v1/ads
{
"status": "ok",
"data": {
"enabled": true,
"slots": {
"top_d": "<!-- kode iklan desktop top -->",
"top_m": "<!-- kode iklan mobile top -->",
"content_d": "<!-- kode iklan desktop tengah -->",
"content_m": "<!-- kode iklan mobile tengah -->",
"sidebar_d": "<!-- kode iklan desktop sidebar -->",
"sidebar_m": "<!-- kode iklan mobile sidebar -->",
"popunder": "<!-- kode popunder -->"
}
}
}
⚙️ Environment Variables #
Konfigurasi Warung Template melalui environment variable di Cloudflare. Tidak ada yang perlu diedit di kode.
# Wajib
DAPUR_API_KEY = usr42_sk_live_a3f9c2e1b8d74f5a
DAPUR_BASE_URL = https://dapur.dukunseo.com
WARUNG_DOMAIN = warungku.com
WARUNG_NAME = WarungKu
WARUNG_TYPE = C
# Opsional — tema
THEME_ACCENT = #ff4d4d
WARUNG_TAGLINE = Streaming Gratis Tanpa Batas
SEO_KEYWORDS = streaming gratis, nonton online, video terbaru
⚡ Rate Limits #
Setiap plan punya batas request per jam dan per bulan. Kalau batas tercapai, API mengembalikan 429 Too Many Requests.
| Plan | Request / Jam | Request / Bulan | Maks Situs | Maks Key |
|---|---|---|---|---|
| 🌱 Basic Gratis | 200 | 100.000 | 1 | 1 |
| ⚡ Pro $7/bln | 1.500 | 600.000 | 10 | 3 |
| 👑 Master $12/bln | 5.000 | 1.000.000 | 15 | 5 |
| 🔮 Hybrid $20/bln | 15.000 | Unlimited | 20 | 10 |
HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 1500 // batas per jam sesuai plan
X-RateLimit-Remaining: 0 // sisa request jam ini
X-RateLimit-Window: 3600 // window dalam detik (selalu 1 jam)
Content-Type: application/json
{
"status": "error",
"code": 429,
"message":"Rate limit exceeded (1500 req/hour). Try again later."
}
🚨 Error Codes #
Format error selalu JSON. Field message berisi penjelasan singkat.
{
"status": "error",
"code": 401,
"message":"API key tidak valid atau sudah dicabut."
}
| HTTP Code | Artinya | Penyebab Umum | Solusi |
|---|---|---|---|
| 400 | Bad Request | Parameter tidak valid, query kosong | Cek format parameter yang dikirim |
| 401 | Unauthorized | API key salah, dicabut, atau format key tidak valid | Cek API key di panel, generate ulang jika perlu |
| 403 | Forbidden | Domain tidak diwhitelist, key model lama, atau plan tidak mencukupi | Pastikan domain terdaftar di panel, atau upgrade plan |
| 404 | Not Found | Konten dengan ID tersebut tidak ada | Pastikan ID valid dan konten masih aktif |
| 429 | Too Many Requests | Melebihi batas request per jam atau per bulan | Tunggu hingga awal jam berikutnya, atau upgrade plan |
| 500 | Internal Server Error | Error di sisi Dapur | Coba lagi dalam beberapa saat. Laporkan ke admin kalau persisten. |
| 503 | Service Unavailable | Dapur sedang maintenance | Tunggu dan coba lagi dalam beberapa saat. |
📦 Format Response #
Semua response menggunakan struktur yang konsisten.
Admin Telegram siap bantu — dari pasang sampai jalan.