{"openapi":"3.0.3","info":{"title":"EventMedia REST API","version":"1.0.0","description":"REST API lengkap untuk EventMedia Indonesia. Akses katalog event, pencarian berfilter, direktori tempat & vendor, kategori, kota, tags, artikel kurasi, pengajuan publik, dan integrasi upload CDN.","contact":{"name":"EventMedia Developer Support","email":"dev@eventmedia.id","url":"https://eventmedia.my.id/apidocs"}},"servers":[{"url":"https://eventmedia.my.id","description":"Current Environment Server"}],"pagination_standard":{"description":"Format pagination standar pada semua endpoint bertipe list/koleksi data.","schema":{"page":"Nomor halaman aktif (integer >= 1)","limit":"Batas jumlah item per halaman (integer, default bervariasi per endpoint, max: 100)","total":"Total keseluruhan record yang sesuai dengan kriteria filter (integer)","total_pages":"Total jumlah halaman yang tersedia (integer)","has_next":"Boolean (true jika ada halaman berikutnya)","has_prev":"Boolean (true jika ada halaman sebelumnya)","next_page":"Nomor halaman selanjutnya atau null","prev_page":"Nomor halaman sebelumnya atau null"},"example":{"page":1,"limit":12,"total":48,"total_pages":4,"has_next":true,"has_prev":false,"next_page":2,"prev_page":null}},"endpoints":[{"id":"events-list","group":"Events","method":"GET","path":"/api/events","summary":"Daftar Event (dengan Pagination & Filter)","description":"Mengambil daftar event aktif dan terverifikasi dengan dukungan pagination, pencarian teks lengkap, filter kategori, kota, tags, format (offline/online), harga (gratis/berbayar), dan pengurutan.","parameters":[{"name":"cursor","in":"query","type":"string","description":"String Base64 cursor untuk Keyset Pagination O(1) seek (direkomendasikan untuk infinite scroll & zero-offset Cloudflare D1 quota optimization)."},{"name":"page","in":"query","type":"integer","default":1,"description":"Nomor halaman (mulai dari 1, digunakan jika cursor tidak disertakan)."},{"name":"limit","in":"query","type":"integer","default":12,"description":"Jumlah event per halaman (max: 100)."},{"name":"q","in":"query","type":"string","description":"Kata kunci pencarian judul, deskripsi, atau organizer."},{"name":"kategori","in":"query","type":"string","description":"Slug kategori event (contoh: \"musik\", \"teknologi\")."},{"name":"kota","in":"query","type":"string","description":"Slug kota pelaksanaan event (contoh: \"jakarta\", \"surabaya\")."},{"name":"tag","in":"query","type":"string","description":"Slug tag spesifik (contoh: \"workshop\", \"festival\")."},{"name":"format","in":"query","type":"string","enum":["offline","online","hybrid"],"description":"Format pelaksanaan event."},{"name":"gratis","in":"query","type":"integer","enum":[0,1],"description":"Filter event gratis (1 = gratis, 0 = berbayar)."},{"name":"sort","in":"query","type":"string","enum":["created_at_desc","start_date_asc","start_date_desc","price_asc","title_asc"],"default":"created_at_desc","description":"Urutan hasil."}],"responses":{"200":{"description":"Daftar event berhasil diambil beserta metadata pagination.","sample":{"success":true,"data":[{"id":"evt-a1b2c3d4","title":"Tech In Motion Summit 2026","slug":"tech-in-motion-summit-2026","short_description":"Konferensi teknologi tahunan terbesar.","poster_url":"https://young-unit-7407.wakeawakewik.workers.dev/example.png","start_date":"2026-11-20","end_date":"2026-11-21","start_time":"09:00","event_type":"offline","venue_name":"Grand City Hall","city_name":"Surabaya","city_slug":"surabaya","category_name":"Teknologi","category_slug":"teknologi","ticket_price_min":75000,"ticket_price_max":250000,"is_free":0,"organizer_name":"DevHub Indonesia"}],"next_cursor":"eyJpZCI6ImV2dC1hMWIyYzNkNCIsImNyZWF0ZWRfYXQiOiIyMDI2LTExLTIwIn0","has_more":true,"pagination":{"page":1,"limit":12,"total":42,"total_pages":4,"has_next":true,"has_prev":false,"next_page":2,"prev_page":null,"next_cursor":"eyJpZCI6ImV2dC1hMWIyYzNkNCIsImNyZWF0ZWRfYXQiOiIyMDI2LTExLTIwIn0","has_more":true,"mode":"hybrid"}}}}},{"id":"events-detail","group":"Events","method":"GET","path":"/api/events/{slug}","summary":"Detail Event Spesifik","description":"Mengambil data lengkap sebuah event berdasarkan slug unik atau ID event, termasuk deskripsi kaya, jadwal, tiket, organizer, koordinat peta, dan relasi tags.","parameters":[{"name":"slug","in":"path","required":true,"type":"string","description":"Slug unik atau ID event."}],"responses":{"200":{"description":"Detail lengkap event ditemukan.","sample":{"success":true,"event":{"id":"evt-a1b2c3d4","title":"Tech In Motion Summit 2026","slug":"tech-in-motion-summit-2026","description":"<p>Detail lengkap mengenai sesi dan pembicara...</p>","poster_url":"https://young-unit-7407.wakeawakewik.workers.dev/example.png","gallery":[],"start_date":"2026-11-20","end_date":"2026-11-21","start_time":"09:00","end_time":"17:00","event_type":"offline","venue_name":"Grand City Hall","venue_address":"Jl. Pemuda No. 1","city_name":"Surabaya","category_name":"Teknologi","organizer_name":"DevHub Indonesia","contact_phone":"081234567890","ticket_url":"https://tiket.example.com","is_free":0,"ticket_price_min":75000,"tags":[{"id":"tag-1","name":"AI","slug":"ai"}]}}},"404":{"description":"Event tidak ditemukan.","sample":{"success":false,"error":"Event tidak ditemukan."}}}},{"id":"events-submit","group":"Events","method":"POST","path":"/api/events/submit","summary":"Kirim Event Publik (Submission Form)","description":"Memungkinkan komunitas dan organizer mengajukan event baru untuk dikurasi dan disetujui oleh tim EventMedia sebelum tayang secara publik.","requestBody":{"type":"application/json","required":true,"schema":{"title":"string (wajib, judul event)","category_id":"string (wajib, ID kategori)","city_id":"string (opsional, ID kota)","start_date":"string YYYY-MM-DD (wajib, tanggal mulai)","end_date":"string YYYY-MM-DD (opsional, tanggal selesai)","start_time":"string HH:mm (opsional, jam mulai)","event_type":"offline | online | hybrid (default: offline)","venue_name":"string (opsional, nama lokasi venue)","venue_address":"string (opsional, alamat lengkap)","organizer_name":"string (wajib, nama penyelenggara)","contact_name":"string (opsional, nama PIC)","contact_phone":"string (wajib jika email kosong)","contact_email":"string (wajib jika nomor telepon kosong)","ticket_price_min":"number (opsional, nominal harga tiket termurah)","is_free":"boolean / 0 / 1 (apakah event gratis)","ticket_url":"string (opsional, tautan pembelian tiket atau registrasi)","poster_url":"string (opsional, URL gambar poster hasil upload CDN)","tags":"string (opsional, koma terpisah, contoh: \"workshop, tech\")"}},"responses":{"201":{"description":"Pengajuan event berhasil disimpan dalam status antrean pending.","sample":{"success":true,"message":"Event Anda berhasil diajukan! Tim kurator EventMedia akan memeriksa dan mengonfirmasi event Anda sebelum dipublikasikan.","event":{"id":"evt-x9y8z7","title":"Workshop Flutter Modern","slug":"workshop-flutter-modern"}}},"400":{"description":"Validasi gagal.","sample":{"success":false,"error":"Judul event wajib diisi."}}}},{"id":"categories-list","group":"Categories","method":"GET","path":"/api/categories","summary":"Daftar Kategori Event (dengan Pagination & Search)","description":"Mengambil daftar kategori event aktif dengan informasi jumlah event dan metadata pagination.","parameters":[{"name":"page","in":"query","type":"integer","default":1,"description":"Nomor halaman."},{"name":"limit","in":"query","type":"integer","default":20,"description":"Jumlah kategori per halaman."},{"name":"q","in":"query","type":"string","description":"Filter pencarian nama atau slug kategori."},{"name":"active_only","in":"query","type":"integer","default":1,"description":"Hanya tampilkan kategori aktif (1/0)."}],"responses":{"200":{"description":"Daftar kategori berhasil diambil.","sample":{"success":true,"data":[{"id":"cat-musik","name":"Musik & Konser","slug":"musik","description":"Konser musik, festival, dan gig lokal.","icon":"Music","image_url":"https://young-unit-7407.wakeawakewik.workers.dev/music.jpg","is_active":1,"sort_order":1}],"pagination":{"page":1,"limit":20,"total":10,"total_pages":1,"has_next":false,"has_prev":false}}}}},{"id":"categories-detail","group":"Categories","method":"GET","path":"/api/categories/{slug}","summary":"Detail Kategori Spesifik","description":"Mengambil informasi kategori berdasarkan slug uniknya.","parameters":[{"name":"slug","in":"path","required":true,"type":"string","description":"Slug unik kategori (contoh: \"musik\")."}],"responses":{"200":{"description":"Detail kategori ditemukan.","sample":{"success":true,"category":{"id":"cat-musik","name":"Musik & Konser","slug":"musik","description":"Konser musik, festival, dan gig lokal.","icon":"Music","is_active":1}}}}},{"id":"cities-list","group":"Cities","method":"GET","path":"/api/cities","summary":"Daftar Kota Pelaksanaan (dengan Pagination & Search)","description":"Mengambil daftar kota tempat penyelenggaraan event lengkap dengan provinsi dan thumbnail.","parameters":[{"name":"page","in":"query","type":"integer","default":1,"description":"Nomor halaman."},{"name":"limit","in":"query","type":"integer","default":20,"description":"Jumlah kota per halaman."},{"name":"q","in":"query","type":"string","description":"Pencarian nama kota atau provinsi."}],"responses":{"200":{"description":"Daftar kota berhasil diambil.","sample":{"success":true,"data":[{"id":"city-jkt","name":"Jakarta","slug":"jakarta","province":"DKI Jakarta","image_url":"https://young-unit-7407.wakeawakewik.workers.dev/jkt.jpg"}],"pagination":{"page":1,"limit":20,"total":8,"total_pages":1,"has_next":false,"has_prev":false}}}}},{"id":"cities-detail","group":"Cities","method":"GET","path":"/api/cities/{slug}","summary":"Detail Kota Spesifik","description":"Mengambil informasi kota berdasarkan slug unik.","parameters":[{"name":"slug","in":"path","required":true,"type":"string","description":"Slug unik kota (contoh: \"surabaya\")."}],"responses":{"200":{"description":"Detail kota ditemukan.","sample":{"success":true,"city":{"id":"city-sby","name":"Surabaya","slug":"surabaya","province":"Jawa Timur","country":"Indonesia"}}}}},{"id":"tags-list","group":"Tags","method":"GET","path":"/api/tags","summary":"Daftar Tags / Topik (dengan Pagination & Search)","description":"Mengambil daftar tag dan topik populer beserta jumlah kemunculan event yang terkait.","parameters":[{"name":"page","in":"query","type":"integer","default":1,"description":"Nomor halaman."},{"name":"limit","in":"query","type":"integer","default":30,"description":"Jumlah tag per halaman."},{"name":"q","in":"query","type":"string","description":"Pencarian nama tag."}],"responses":{"200":{"description":"Daftar tag berhasil diambil.","sample":{"success":true,"data":[{"id":"tag-1","name":"Festival","slug":"festival","event_count":14},{"id":"tag-2","name":"Workshop","slug":"workshop","event_count":9}],"pagination":{"page":1,"limit":30,"total":24,"total_pages":1,"has_next":false,"has_prev":false}}}}},{"id":"news-list","group":"Articles & News","method":"GET","path":"/api/news","summary":"Daftar Artikel & Berita (dengan Pagination)","description":"Mengambil artikel berita, tips event, liputan dan ulasan dari kurator EventMedia dengan pagination.","parameters":[{"name":"page","in":"query","type":"integer","default":1,"description":"Nomor halaman aktif."},{"name":"limit","in":"query","type":"integer","default":9,"description":"Batas jumlah artikel per halaman (max: 50)."},{"name":"q","in":"query","type":"string","description":"Pencarian teks judul atau isi berita."},{"name":"kategori","in":"query","type":"string","description":"Kategori artikel (contoh: \"Tips Event\", \"Liputan\")."},{"name":"featured","in":"query","type":"integer","enum":[0,1],"description":"Hanya artikel pilihan editor."}],"responses":{"200":{"description":"Daftar artikel berita berhasil diambil.","sample":{"success":true,"data":[{"id":"news-01","title":"Panduan Lengkap Mengatur Budget Festival Musik","slug":"panduan-lengkap-budget-festival-musik","excerpt":"Kiat hemat dan nyaman menikmati rangkaian festival musik di Indonesia...","cover_url":"https://young-unit-7407.wakeawakewik.workers.dev/news1.jpg","category":"Tips Event","author_name":"Redaksi EventMedia","published_at":"2026-08-10T10:00:00Z"}],"pagination":{"page":1,"limit":9,"total":18,"total_pages":2,"has_next":true,"has_prev":false,"next_page":2,"prev_page":null}}}}},{"id":"news-detail","group":"Articles & News","method":"GET","path":"/api/news/{slug}","summary":"Detail Artikel Berita","description":"Mengambil konten lengkap artikel, format teks HTML, info penulis, dan tanggal publikasi.","parameters":[{"name":"slug","in":"path","required":true,"type":"string","description":"Slug unik artikel berita."}],"responses":{"200":{"description":"Detail artikel berita ditemukan.","sample":{"success":true,"article":{"id":"news-01","title":"Panduan Lengkap Mengatur Budget Festival Musik","slug":"panduan-lengkap-budget-festival-musik","content":"<p>Isi lengkap konten artikel di sini...</p>","cover_url":"https://young-unit-7407.wakeawakewik.workers.dev/news1.jpg","author_name":"Redaksi EventMedia","published_at":"2026-08-10T10:00:00Z"}}}}},{"id":"directories-list","group":"Directory & Vendors","method":"GET","path":"/api/directories","summary":"Daftar Direktori Tempat & Vendor (dengan Filter & Pagination)","description":"Mengambil katalog direktori vendor acara, wedding organizer, venue ballroom/hotel, sewa sound system, katering, dan tempat event dengan filter pencarian teks, kategori, kota, dan status unggulan.","parameters":[{"name":"page","in":"query","type":"integer","default":1,"description":"Nomor halaman (mulai dari 1)."},{"name":"limit","in":"query","type":"integer","default":12,"description":"Jumlah data per halaman (max: 100)."},{"name":"q","in":"query","type":"string","description":"Kata kunci pencarian nama, deskripsi, atau alamat vendor/venue."},{"name":"kategori","in":"query","type":"string","description":"Slug atau ID kategori direktori (contoh: \"hotel-penginapan\", \"organizer-eo-wo\", \"sewa-alat-sound\")."},{"name":"kota","in":"query","type":"string","description":"Slug atau ID kota lokasi (contoh: \"jakarta\", \"bali\", \"bandung\")."},{"name":"featured","in":"query","type":"integer","enum":[0,1],"description":"Filter item rekomendasi/unggulan (1 = unggulan, 0 = reguler)."}],"responses":{"200":{"description":"Daftar direktori berhasil diambil dengan metadata pagination.","sample":{"success":true,"data":[{"id":"dir-01","name":"Grand Ballroom & Convention Center Senayan","slug":"grand-ballroom-convention-center-senayan","category_id":"dcat-venue","category_title":"Venue & Gedung","category_slug":"venue-gedung","city_id":"city-jkt","city_title":"Jakarta","city_slug":"jakarta","address":"Jl. Asia Afrika No.8, Gelora, Tanah Abang, Jakarta Pusat","rating":4.9,"phone":"(021) 57901234","whatsapp":"6281119888234","email":"venue@senayanballroom.com","website_url":"https://senayanballroom.com","instagram_url":"https://instagram.com/senayanballroom","price_range":"Mulai Rp 45.000.000 / hari","short_description":"Ballroom megah berkapasitas hingga 3.500 tamu di pusat Jakarta.","image_url":"https://images.unsplash.com/photo-1519167758481-83f550bb49b3?auto=format&fit=crop&w=1200&q=80","is_featured":1,"is_verified":1,"facilities_json":"[\"Kapasitas 3.500 Tamu\", \"Panggung Rigging & Lighting\", \"Sound System Line Array 20.000W\", \"Ruang Rias VIP Eksklusif\", \"Parkir 500 Mobil\", \"Akses Loading Dock Kontainer\"]"}],"pagination":{"page":1,"limit":12,"total":6,"total_pages":1,"has_next":false,"has_prev":false,"next_page":null,"prev_page":null}}}}},{"id":"directories-detail","group":"Directory & Vendors","method":"GET","path":"/api/directories/{slug}","summary":"Detail Profil Direktori & Vendor","description":"Mengambil profil komprehensif sebuah tempat acara atau vendor menurut slug unik atau ID, termasuk daftar fasilitas lengkap, rating, galeri foto, alamat, koordinat peta, kontak WhatsApp, email, dan jam operasional.","parameters":[{"name":"slug","in":"path","required":true,"type":"string","description":"Slug unik direktori (contoh: \"grand-ballroom-convention-center-senayan\") atau ID unik (contoh: \"dir-01\")."}],"responses":{"200":{"description":"Profil direktori ditemukan.","sample":{"success":true,"data":{"id":"dir-01","name":"Grand Ballroom & Convention Center Senayan","slug":"grand-ballroom-convention-center-senayan","category_title":"Venue & Gedung","city_title":"Jakarta","address":"Jl. Asia Afrika No.8, Gelora, Tanah Abang, Jakarta Pusat","map_url":"https://maps.google.com/?q=Jakarta","phone":"(021) 57901234","whatsapp":"6281119888234","email":"venue@senayanballroom.com","website_url":"https://senayanballroom.com","instagram_url":"https://instagram.com/senayanballroom","price_range":"Mulai Rp 45.000.000 / hari","rating":4.9,"opening_hours":"Senin - Minggu, 08:00 - 22:00 WIB","short_description":"Ballroom megah berkapasitas hingga 3.500 tamu di pusat Jakarta.","description":"<p>Grand Ballroom Senayan adalah pilihan utama untuk konser indoor megah, pernikahan berskala akbar, dan pameran bertaraf internasional.</p>","image_url":"https://images.unsplash.com/photo-1519167758481-83f550bb49b3?auto=format&fit=crop&w=1200&q=80","is_featured":1,"is_verified":1,"facilities_json":"[\"Kapasitas 3.500 Tamu\", \"Panggung Rigging & Lighting\", \"Sound System Line Array 20.000W\", \"Ruang Rias VIP Eksklusif\", \"Parkir 500 Mobil\", \"Akses Loading Dock Kontainer\"]","gallery_json":"[\"https://images.unsplash.com/photo-1511795409834-ef04bbd61622?auto=format&fit=crop&w=800&q=80\"]"}}},"404":{"description":"Direktori tidak ditemukan.","sample":{"success":false,"error":"Direktori tidak ditemukan."}}}},{"id":"directories-categories","group":"Directory & Vendors","method":"GET","path":"/api/directory-categories","summary":"Daftar Kategori Direktori Tempat & Vendor","description":"Mengambil seluruh kategori spesialisasi direktori (Venue & Gedung, Hotel & Penginapan, Restoran & Cafe, Sewa Alat & Sound, Event & Wedding Organizer, Catering & F&B).","parameters":[{"name":"active_only","in":"query","type":"integer","default":1,"description":"Hanya tampilkan kategori aktif (1/0)."}],"responses":{"200":{"description":"Daftar kategori direktori berhasil diambil.","sample":{"success":true,"data":[{"id":"dcat-venue","name":"Venue & Gedung","slug":"venue-gedung","icon":"BuildingLibraryIcon","is_active":1,"sort_order":1},{"id":"dcat-hotel","name":"Hotel & Penginapan","slug":"hotel-penginapan","icon":"BuildingOfficeIcon","is_active":1,"sort_order":2},{"id":"dcat-rental","name":"Sewa Alat & Sound","slug":"sewa-alat-sound","icon":"SpeakerWaveIcon","is_active":1,"sort_order":3},{"id":"dcat-resto","name":"Restoran & Cafe","slug":"restoran-cafe","icon":"CakeIcon","is_active":1,"sort_order":4},{"id":"dcat-eo","name":"Event & Wedding Organizer","slug":"organizer-eo-wo","icon":"UserGroupIcon","is_active":1,"sort_order":5},{"id":"dcat-catering","name":"Catering & F&B Service","slug":"catering-fb-service","icon":"SparklesIcon","is_active":1,"sort_order":6}]}}}},{"id":"directories-submit","group":"Directory & Vendors","method":"POST","path":"/api/directories/submit","summary":"Pendaftaran Profil Usaha / Vendor Baru (Submission Form)","description":"Memungkinkan pemilik venue, vendor EO, sound system, hotel, atau katering mengajukan profil bisnis mereka untuk dikurasi dan dipublikasikan di direktori EventMedia.","requestBody":{"type":"application/json","required":true,"schema":{"name":"string (wajib, nama vendor atau tempat)","category_id":"string (wajib, ID kategori direktori, contoh: \"dcat-venue\")","city_id":"string (opsional, ID kota)","address":"string (opsional, alamat lokasi fisik)","map_url":"string (opsional, tautan Google Maps)","phone":"string (opsional, nomor telepon kantor)","whatsapp":"string (opsional, nomor WhatsApp resmi layanan/reservasi)","email":"string (opsional, alamat email)","website_url":"string (opsional, situs web resmi)","instagram_url":"string (opsional, tautan Instagram bisnis)","price_range":"string (opsional, kisaran tarif/harga layanan)","short_description":"string (opsional, ringkasan profil 1-2 kalimat)","description":"string (opsional, deskripsi lengkap format teks atau HTML)","image_url":"string (opsional, foto sampul/profil utama)","facilities":"array string (opsional, daftar fasilitas yang disediakan)"}},"responses":{"201":{"description":"Pendaftaran profil direktori berhasil diajukan.","sample":{"success":true,"message":"Profil direktori / vendor berhasil diajukan! Tim kurator EventMedia akan memeriksa sebelum dipublikasikan.","data":{"id":"dir-n1o2p3","name":"Studio Akustik Prima","slug":"studio-akustik-prima"}}},"400":{"description":"Validasi gagal.","sample":{"success":false,"error":"Nama tempat/vendor wajib diisi."}}}},{"id":"cdn-upload","group":"CDN File Upload","method":"POST","path":"/api/upload","summary":"Upload Gambar / Poster ke Cloudflare CDN","description":"Endpoint upload file multipart/form-data. File diunggah langsung atau diproksikan ke layanan CDN aksisoft (cfcdn.aksisoft.my.id) dan mengembalikan URL publik langsung (data.url). Batas ukuran file 24 MB.","requestBody":{"type":"multipart/form-data","required":true,"schema":{"file":"binary / file (wajib, file gambar format PNG, JPG, JPEG, WEBP, maks 24 MB)"}},"responses":{"200":{"description":"File berhasil diunggah ke CDN.","sample":{"success":true,"url":"https://young-unit-7407.wakeawakewik.workers.dev/1402bb895e-poster.png","data":{"url":"https://young-unit-7407.wakeawakewik.workers.dev/1402bb895e-poster.png"}}},"400":{"description":"Gagal mengunggah file.","sample":{"success":false,"error":"File tidak ditemukan atau format tidak didukung."}}}},{"id":"cdn-check-file","group":"CDN File Upload","method":"GET","path":"/api/check-file","summary":"Verifikasi Ketersediaan File di CDN (Pengecekan Resolusi)","description":"Mengecek ketersediaan dan status resolusi HTTP (HEAD/GET) dari URL file CDN. Direkomendasikan dipanggil setelah upload berhasil dan menunggu 5-10 detik masa propagasi CDN.","queryParams":[{"name":"url","type":"string","required":true,"description":"URL file CDN lengkap yang didapat dari data.url"}],"responses":{"200":{"description":"Status ketersediaan file berhasil dicek.","sample":{"url":"https://cfcdn.aksisoft.my.id/uploads/sample-poster.jpg","exists":true,"status":200,"timestamp":"2026-09-16T16:50:00.000Z"}}}},{"id":"stats-get","group":"Platform Stats & Settings","method":"GET","path":"/api/stats","summary":"Statistik Publik Platform","description":"Mengambil metrik ringkasan jumlah event aktif terverifikasi, jumlah tempat & vendor direktori, kota, kategori, dan artikel berita di EventMedia.","responses":{"200":{"description":"Statistik publik berhasil diambil.","sample":{"success":true,"stats":{"total_events":58,"published_events":52,"total_directories":6,"total_categories":12,"total_cities":10,"total_news":15}}}}},{"id":"settings-get","group":"Platform Stats & Settings","method":"GET","path":"/api/settings","summary":"Pengaturan Publik Situs","description":"Mengambil konfigurasi publik situs seperti judul, meta description, kontak, logo URL, dan tautan sosial media.","responses":{"200":{"description":"Pengaturan publik berhasil diambil.","sample":{"success":true,"settings":{"site_title":"EventMedia.id","site_tagline":"Katalog & Portal Event Terlengkap Indonesia","site_logo":"/logo.svg","instagram_url":"https://instagram.com/eventmedia"}}}}},{"id":"admin-auth-login","group":"Admin Auth & Management","method":"POST","path":"/api/admin/login","summary":"Autentikasi Admin (Login)","description":"Melakukan login admin menggunakan username dan password. Jika berhasil, server akan menetapkan HttpOnly session cookie.","requestBody":{"type":"application/json","required":true,"schema":{"username":"string (wajib)","password":"string (wajib)"}},"responses":{"200":{"description":"Login berhasil.","sample":{"success":true,"user":{"id":"usr-admin","username":"admin","name":"Administrator","role":"superadmin"}}},"401":{"description":"Kredensial tidak valid.","sample":{"success":false,"error":"Username atau password salah."}}}},{"id":"admin-events-list","group":"Admin Auth & Management","method":"GET","path":"/api/admin/events","summary":"Daftar Event Admin (Semua Status & Pending Moderasi)","description":"Membutuhkan cookie sesi admin terautentikasi. Mengambil seluruh event termasuk draft, pending, rejected, dan published.","parameters":[{"name":"page","in":"query","type":"integer","default":1},{"name":"limit","in":"query","type":"integer","default":50},{"name":"status","in":"query","type":"string","enum":["all","published","pending","draft","rejected"]},{"name":"q","in":"query","type":"string"}],"responses":{"200":{"description":"Daftar event admin.","sample":{"success":true,"events":[],"total":58,"page":1,"limit":50}},"401":{"description":"Sesi tidak sah.","sample":{"success":false,"error":"Sesi kedaluwarsa atau akses ditolak."}}}},{"id":"admin-events-approve","group":"Admin Auth & Management","method":"POST","path":"/api/admin/events/{id}/approve","summary":"Konfirmasi / Publikasikan Event Submission","description":"Menyetujui event kiriman publik menjadi status published.","parameters":[{"name":"id","in":"path","required":true,"type":"string"}],"responses":{"200":{"description":"Event berhasil disetujui.","sample":{"success":true,"message":"Event berhasil dikonfirmasi dan diterbitkan."}}}},{"id":"admin-directories-list","group":"Admin Auth & Management","method":"GET","path":"/api/admin/directories","summary":"Kelola Seluruh Direktori (Admin)","description":"Memerlukan sesi admin. Mengambil semua data vendor dan tempat acara terdaftar termasuk status draft dan unpublished.","parameters":[{"name":"page","in":"query","type":"integer","default":1},{"name":"limit","in":"query","type":"integer","default":50},{"name":"q","in":"query","type":"string","description":"Pencarian nama vendor/venue"},{"name":"category_id","in":"query","type":"string"},{"name":"city_id","in":"query","type":"string"}],"responses":{"200":{"description":"Daftar direktori admin berhasil diambil.","sample":{"success":true,"directories":[],"total":6,"page":1,"limit":50}},"401":{"description":"Sesi kedaluwarsa.","sample":{"success":false,"error":"Sesi kedaluwarsa atau akses ditolak."}}}},{"id":"admin-directories-create","group":"Admin Auth & Management","method":"POST","path":"/api/admin/directories","summary":"Tambah Direktori Vendor / Tempat Baru (Admin)","description":"Menambahkan entri profil direktori baru langsung dengan status published/terverifikasi oleh admin.","responses":{"201":{"description":"Direktori berhasil ditambahkan.","sample":{"success":true,"directory":{"id":"dir-07","name":"Vendor Audio Pro"}}}}},{"id":"admin-directories-update","group":"Admin Auth & Management","method":"PUT","path":"/api/admin/directories/{id}","summary":"Perbarui Data Direktori (Admin)","description":"Memperbarui profil, fasilitas, kontak, status publikasi, dan status unggulan direktori vendor/venue.","parameters":[{"name":"id","in":"path","required":true,"type":"string"}],"responses":{"200":{"description":"Direktori berhasil diperbarui.","sample":{"success":true,"directory":{"id":"dir-01","name":"Grand Ballroom"}}}}},{"id":"admin-directories-delete","group":"Admin Auth & Management","method":"DELETE","path":"/api/admin/directories/{id}","summary":"Hapus Direktori (Admin)","description":"Menghapus direktori dari sistem.","parameters":[{"name":"id","in":"path","required":true,"type":"string"}],"responses":{"200":{"description":"Direktori berhasil dihapus.","sample":{"success":true}}}}]}