EventMedia REST API v1
Kembali ke Website
EventMedia Public & Partner API v1.0.0

Dokumentasi REST API EventMedia

Selamat datang di portal dokumentasi REST API EventMedia. API ini menyediakan akses terprogram ke seluruh katalog event Indonesia, direktori kota, kategori, tagar pencarian, artikel berita, pengajuan event publik, serta integrasi unggah file/poster langsung ke CDN.

Base URL Endpoint
https://eventmedia.my.id
Protokol & Format
HTTPS + JSON (UTF-8)
Autentikasi Publik
Bebas Tanpa Token API
CORS Support
Diizinkan (Cross-Origin)

Panduan Standar Pagination JSON

Semua endpoint koleksi data (seperti /api/events, /api/news, /api/categories, /api/cities, /api/tags) mengimplementasikan format pagination standar untuk memudahkan navigasi halaman pada aplikasi client:

Struktur Objek pagination di Respons JSON Standard Object
{
  "success": true,
  "data": [ /* Array item data */ ],
  "pagination": {
    "page": 1,          // Nomor halaman aktif (integer)
    "limit": 12,        // Jumlah item per halaman (integer)
    "total": 48,        // Total keseluruhan item yang sesuai (integer)
    "total_pages": 4,   // Total kalkulasi halaman (ceil(total / limit))
    "has_next": true,   // true jika ada halaman setelah ini
    "has_prev": false,  // true jika ada halaman sebelum ini
    "next_page": 2,     // Angka halaman berikutnya atau null
    "prev_page": null   // Angka halaman sebelumnya atau null
  }
}
Parameter Query Pagination:
  • page: integer, default = 1.
  • limit: integer, batas item (default 12 untuk event, 9 untuk artikel, 20 untuk kota/kategori, maksimum 100).

Format Respons & Kode Status HTTP

Seluruh respons mengembalikan format JSON yang konsisten. Jika terjadi kesalahan, status HTTP non-200 disertai pesan penjelasan di properti error.

Respons Sukses (200 / 201)
{
  "success": true,
  "data": [ ... ],
  "pagination": { ... }
}
Respons Error (400 / 401 / 404 / 500)
{
  "success": false,
  "error": "Pesan deskripsi kesalahan..."
}

Integrasi Upload Poster ke CDN (cfcdn.aksisoft.my.id)

Aplikasi menggunakan arsitektur AJAX upload langsung ke endpoint CDN https://cfcdn.aksisoft.my.id/index.php (atau via proxy lokal /api/upload). API mengembalikan objek dengan properti data.url yang dapat langsung disematkan sebagai poster_url event.

Perhatian Waktu Resolusi CDN: File yang baru diunggah membutuhkan waktu propagasi sekitar 5 hingga 10 detik di CDN sebelum file dapat diakses secara publik. Sistem menunggu 5 detik awal, kemudian memverifikasi ketersediaan file hingga detik ke-10 (via /api/check-file?url=...) sebelum memperbarui pratinjau gambar.
Contoh AJAX JavaScript (XMLHttpRequest) Upload File dengan Live Progress & Resolusi CDN:
const formData = new FormData();
formData.append('file', fileInput.files[0]);

// 1. Upload file dengan tracking progress (0 - 100%)
const uploadedData = await new Promise((resolve, reject) => {
  const xhr = new XMLHttpRequest();
  xhr.open('POST', 'https://cfcdn.aksisoft.my.id/index.php'); // atau proxy /api/upload
  xhr.upload.onprogress = (e) => {
    if (e.lengthComputable) {
      const percent = Math.round((e.loaded / e.total) * 100);
      console.log('Progress: ' + percent + '% (' + e.loaded + '/' + e.total + ' bytes)');
      // Update UI progress bar
    }
  };
  xhr.onload = () => xhr.status >= 200 && xhr.status < 300 
    ? resolve(JSON.parse(xhr.responseText)) 
    : reject(new Error('Upload gagal HTTP ' + xhr.status));
  xhr.onerror = () => reject(new Error('Koneksi terputus'));
  xhr.send(formData);
});

const uploadedImageUrl = uploadedData.data?.url || uploadedData.url;

// 2. Tunggu 5 - 10 detik masa resolusi CDN sebelum menampilkan preview
for (let s = 5; s >= 1; s--) {
  console.log('Menunggu resolusi CDN: ' + s + ' detik tersisa...');
  await new Promise(r => setTimeout(r, 1000));
}

// 3. Cek ketersediaan file di CDN
const checkRes = await fetch('/api/check-file?url=' + encodeURIComponent(uploadedImageUrl));
const checkData = await checkRes.json();
if (checkData.exists) {
  console.log('File siap digunakan:', uploadedImageUrl);
}

Katalog Lengkap Endpoint API

25 endpoints terdaftar
GET /api/events
Events

Daftar Event (dengan Pagination & Filter)

Mengambil daftar event aktif dan terverifikasi dengan dukungan pagination, pencarian teks lengkap, filter kategori, kota, tags, format (offline/online), harga (gratis/berbayar), dan pengurutan.

Parameter Permintaan
Parameter Lokasi Tipe Wajib Deskripsi
cursor query string Tidak String Base64 cursor untuk Keyset Pagination O(1) seek (direkomendasikan untuk infinite scroll & zero-offset Cloudflare D1 quota optimization).
page query integer Tidak Nomor halaman (mulai dari 1, digunakan jika cursor tidak disertakan).
limit query integer Tidak Jumlah event per halaman (max: 100).
q query string Tidak Kata kunci pencarian judul, deskripsi, atau organizer.
kategori query string Tidak Slug kategori event (contoh: "musik", "teknologi").
kota query string Tidak Slug kota pelaksanaan event (contoh: "jakarta", "surabaya").
tag query string Tidak Slug tag spesifik (contoh: "workshop", "festival").
format query string Tidak Format pelaksanaan event.
gratis query integer Tidak Filter event gratis (1 = gratis, 0 = berbayar).
sort query string Tidak Urutan hasil.
Contoh cURL
curl -X GET "https://eventmedia.my.id/api/events?page=1&limit=12" \
  -H "Accept: application/json"
Contoh Respons (200 OK)
{
  "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"
  }
}
GET /api/events/{slug}
Events

Detail Event Spesifik

Mengambil data lengkap sebuah event berdasarkan slug unik atau ID event, termasuk deskripsi kaya, jadwal, tiket, organizer, koordinat peta, dan relasi tags.

Parameter Permintaan
Parameter Lokasi Tipe Wajib Deskripsi
slug path string Ya Slug unik atau ID event.
Contoh cURL
curl -X GET "https://eventmedia.my.id/api/events/tech-in-motion-2026?page=1&limit=12" \
  -H "Accept: application/json"
Contoh Respons (200 OK)
{
  "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"
      }
    ]
  }
}
POST /api/events/submit
Events

Kirim Event Publik (Submission Form)

Memungkinkan komunitas dan organizer mengajukan event baru untuk dikurasi dan disetujui oleh tim EventMedia sebelum tayang secara publik.

Request Body (application/json)
{
  "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\")"
}
Contoh cURL
curl -X POST "https://eventmedia.my.id/api/events/submit" \
  -H "Accept: application/json"
Contoh Respons (200 OK)
{
  "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"
  }
}
Format: JSON
GET /api/categories
Categories

Daftar Kategori Event (dengan Pagination & Search)

Mengambil daftar kategori event aktif dengan informasi jumlah event dan metadata pagination.

Parameter Permintaan
Parameter Lokasi Tipe Wajib Deskripsi
page query integer Tidak Nomor halaman.
limit query integer Tidak Jumlah kategori per halaman.
q query string Tidak Filter pencarian nama atau slug kategori.
active_only query integer Tidak Hanya tampilkan kategori aktif (1/0).
Contoh cURL
curl -X GET "https://eventmedia.my.id/api/categories?page=1&limit=12" \
  -H "Accept: application/json"
Contoh Respons (200 OK)
{
  "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
  }
}
GET /api/categories/{slug}
Categories

Detail Kategori Spesifik

Mengambil informasi kategori berdasarkan slug uniknya.

Parameter Permintaan
Parameter Lokasi Tipe Wajib Deskripsi
slug path string Ya Slug unik kategori (contoh: "musik").
Contoh cURL
curl -X GET "https://eventmedia.my.id/api/categories/tech-in-motion-2026?page=1&limit=12" \
  -H "Accept: application/json"
Contoh Respons (200 OK)
{
  "success": true,
  "category": {
    "id": "cat-musik",
    "name": "Musik & Konser",
    "slug": "musik",
    "description": "Konser musik, festival, dan gig lokal.",
    "icon": "Music",
    "is_active": 1
  }
}
GET /api/cities
Cities

Daftar Kota Pelaksanaan (dengan Pagination & Search)

Mengambil daftar kota tempat penyelenggaraan event lengkap dengan provinsi dan thumbnail.

Parameter Permintaan
Parameter Lokasi Tipe Wajib Deskripsi
page query integer Tidak Nomor halaman.
limit query integer Tidak Jumlah kota per halaman.
q query string Tidak Pencarian nama kota atau provinsi.
Contoh cURL
curl -X GET "https://eventmedia.my.id/api/cities?page=1&limit=12" \
  -H "Accept: application/json"
Contoh Respons (200 OK)
{
  "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
  }
}
GET /api/cities/{slug}
Cities

Detail Kota Spesifik

Mengambil informasi kota berdasarkan slug unik.

Parameter Permintaan
Parameter Lokasi Tipe Wajib Deskripsi
slug path string Ya Slug unik kota (contoh: "surabaya").
Contoh cURL
curl -X GET "https://eventmedia.my.id/api/cities/tech-in-motion-2026?page=1&limit=12" \
  -H "Accept: application/json"
Contoh Respons (200 OK)
{
  "success": true,
  "city": {
    "id": "city-sby",
    "name": "Surabaya",
    "slug": "surabaya",
    "province": "Jawa Timur",
    "country": "Indonesia"
  }
}
GET /api/tags
Tags

Daftar Tags / Topik (dengan Pagination & Search)

Mengambil daftar tag dan topik populer beserta jumlah kemunculan event yang terkait.

Parameter Permintaan
Parameter Lokasi Tipe Wajib Deskripsi
page query integer Tidak Nomor halaman.
limit query integer Tidak Jumlah tag per halaman.
q query string Tidak Pencarian nama tag.
Contoh cURL
curl -X GET "https://eventmedia.my.id/api/tags?page=1&limit=12" \
  -H "Accept: application/json"
Contoh Respons (200 OK)
{
  "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
  }
}
GET /api/news
Articles & News

Daftar Artikel & Berita (dengan Pagination)

Mengambil artikel berita, tips event, liputan dan ulasan dari kurator EventMedia dengan pagination.

Parameter Permintaan
Parameter Lokasi Tipe Wajib Deskripsi
page query integer Tidak Nomor halaman aktif.
limit query integer Tidak Batas jumlah artikel per halaman (max: 50).
q query string Tidak Pencarian teks judul atau isi berita.
kategori query string Tidak Kategori artikel (contoh: "Tips Event", "Liputan").
featured query integer Tidak Hanya artikel pilihan editor.
Contoh cURL
curl -X GET "https://eventmedia.my.id/api/news?page=1&limit=12" \
  -H "Accept: application/json"
Contoh Respons (200 OK)
{
  "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
  }
}
GET /api/news/{slug}
Articles & News

Detail Artikel Berita

Mengambil konten lengkap artikel, format teks HTML, info penulis, dan tanggal publikasi.

Parameter Permintaan
Parameter Lokasi Tipe Wajib Deskripsi
slug path string Ya Slug unik artikel berita.
Contoh cURL
curl -X GET "https://eventmedia.my.id/api/news/tech-in-motion-2026?page=1&limit=12" \
  -H "Accept: application/json"
Contoh Respons (200 OK)
{
  "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"
  }
}
GET /api/directories
Directory & Vendors

Daftar Direktori Tempat & Vendor (dengan Filter & Pagination)

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.

Parameter Permintaan
Parameter Lokasi Tipe Wajib Deskripsi
page query integer Tidak Nomor halaman (mulai dari 1).
limit query integer Tidak Jumlah data per halaman (max: 100).
q query string Tidak Kata kunci pencarian nama, deskripsi, atau alamat vendor/venue.
kategori query string Tidak Slug atau ID kategori direktori (contoh: "hotel-penginapan", "organizer-eo-wo", "sewa-alat-sound").
kota query string Tidak Slug atau ID kota lokasi (contoh: "jakarta", "bali", "bandung").
featured query integer Tidak Filter item rekomendasi/unggulan (1 = unggulan, 0 = reguler).
Contoh cURL
curl -X GET "https://eventmedia.my.id/api/directories?page=1&limit=12" \
  -H "Accept: application/json"
Contoh Respons (200 OK)
{
  "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
  }
}
GET /api/directories/{slug}
Directory & Vendors

Detail Profil Direktori & Vendor

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.

Parameter Permintaan
Parameter Lokasi Tipe Wajib Deskripsi
slug path string Ya Slug unik direktori (contoh: "grand-ballroom-convention-center-senayan") atau ID unik (contoh: "dir-01").
Contoh cURL
curl -X GET "https://eventmedia.my.id/api/directories/tech-in-motion-2026?page=1&limit=12" \
  -H "Accept: application/json"
Contoh Respons (200 OK)
{
  "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\"]"
  }
}
GET /api/directory-categories
Directory & Vendors

Daftar Kategori Direktori Tempat & Vendor

Mengambil seluruh kategori spesialisasi direktori (Venue & Gedung, Hotel & Penginapan, Restoran & Cafe, Sewa Alat & Sound, Event & Wedding Organizer, Catering & F&B).

Parameter Permintaan
Parameter Lokasi Tipe Wajib Deskripsi
active_only query integer Tidak Hanya tampilkan kategori aktif (1/0).
Contoh cURL
curl -X GET "https://eventmedia.my.id/api/directory-categories?page=1&limit=12" \
  -H "Accept: application/json"
Contoh Respons (200 OK)
{
  "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
    }
  ]
}
POST /api/directories/submit
Directory & Vendors

Pendaftaran Profil Usaha / Vendor Baru (Submission Form)

Memungkinkan pemilik venue, vendor EO, sound system, hotel, atau katering mengajukan profil bisnis mereka untuk dikurasi dan dipublikasikan di direktori EventMedia.

Request Body (application/json)
{
  "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)"
}
Contoh cURL
curl -X POST "https://eventmedia.my.id/api/directories/submit" \
  -H "Accept: application/json"
Contoh Respons (200 OK)
{
  "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"
  }
}
Format: JSON
POST /api/upload
CDN File Upload

Upload Gambar / Poster ke Cloudflare CDN

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.

Request Body (multipart/form-data)
{
  "file": "binary / file (wajib, file gambar format PNG, JPG, JPEG, WEBP, maks 24 MB)"
}
Contoh cURL
curl -X POST "https://eventmedia.my.id/api/upload" \
  -H "Accept: application/json"
Contoh Respons (200 OK)
{
  "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"
  }
}
Format: JSON
GET /api/check-file
CDN File Upload

Verifikasi Ketersediaan File di CDN (Pengecekan Resolusi)

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.

Contoh cURL
curl -X GET "https://eventmedia.my.id/api/check-file" \
  -H "Accept: application/json"
Contoh Respons (200 OK)
{
  "url": "https://cfcdn.aksisoft.my.id/uploads/sample-poster.jpg",
  "exists": true,
  "status": 200,
  "timestamp": "2026-09-16T16:50:00.000Z"
}
GET /api/stats
Platform Stats & Settings

Statistik Publik Platform

Mengambil metrik ringkasan jumlah event aktif terverifikasi, jumlah tempat & vendor direktori, kota, kategori, dan artikel berita di EventMedia.

Contoh cURL
curl -X GET "https://eventmedia.my.id/api/stats" \
  -H "Accept: application/json"
Contoh Respons (200 OK)
{
  "success": true,
  "stats": {
    "total_events": 58,
    "published_events": 52,
    "total_directories": 6,
    "total_categories": 12,
    "total_cities": 10,
    "total_news": 15
  }
}
GET /api/settings
Platform Stats & Settings

Pengaturan Publik Situs

Mengambil konfigurasi publik situs seperti judul, meta description, kontak, logo URL, dan tautan sosial media.

Contoh cURL
curl -X GET "https://eventmedia.my.id/api/settings" \
  -H "Accept: application/json"
Contoh Respons (200 OK)
{
  "success": true,
  "settings": {
    "site_title": "EventMedia.id",
    "site_tagline": "Katalog & Portal Event Terlengkap Indonesia",
    "site_logo": "/logo.svg",
    "instagram_url": "https://instagram.com/eventmedia"
  }
}
POST /api/admin/login
Admin Auth & Management

Autentikasi Admin (Login)

Melakukan login admin menggunakan username dan password. Jika berhasil, server akan menetapkan HttpOnly session cookie.

Request Body (application/json)
{
  "username": "string (wajib)",
  "password": "string (wajib)"
}
Contoh cURL
curl -X POST "https://eventmedia.my.id/api/admin/login" \
  -H "Accept: application/json"
Contoh Respons (200 OK)
{
  "success": true,
  "user": {
    "id": "usr-admin",
    "username": "admin",
    "name": "Administrator",
    "role": "superadmin"
  }
}
Format: JSON
GET /api/admin/events
Admin Auth & Management

Daftar Event Admin (Semua Status & Pending Moderasi)

Membutuhkan cookie sesi admin terautentikasi. Mengambil seluruh event termasuk draft, pending, rejected, dan published.

Parameter Permintaan
Parameter Lokasi Tipe Wajib Deskripsi
page query integer Tidak
limit query integer Tidak
status query string Tidak
q query string Tidak
Contoh cURL
curl -X GET "https://eventmedia.my.id/api/admin/events?page=1&limit=12" \
  -H "Accept: application/json"
Contoh Respons (200 OK)
{
  "success": true,
  "events": [],
  "total": 58,
  "page": 1,
  "limit": 50
}
POST /api/admin/events/{id}/approve
Admin Auth & Management

Konfirmasi / Publikasikan Event Submission

Menyetujui event kiriman publik menjadi status published.

Parameter Permintaan
Parameter Lokasi Tipe Wajib Deskripsi
id path string Ya
Contoh cURL
curl -X POST "https://eventmedia.my.id/api/admin/events/evt-sample/approve" \
  -H "Accept: application/json"
Contoh Respons (200 OK)
{
  "success": true,
  "message": "Event berhasil dikonfirmasi dan diterbitkan."
}
Format: JSON
GET /api/admin/directories
Admin Auth & Management

Kelola Seluruh Direktori (Admin)

Memerlukan sesi admin. Mengambil semua data vendor dan tempat acara terdaftar termasuk status draft dan unpublished.

Parameter Permintaan
Parameter Lokasi Tipe Wajib Deskripsi
page query integer Tidak
limit query integer Tidak
q query string Tidak Pencarian nama vendor/venue
category_id query string Tidak
city_id query string Tidak
Contoh cURL
curl -X GET "https://eventmedia.my.id/api/admin/directories?page=1&limit=12" \
  -H "Accept: application/json"
Contoh Respons (200 OK)
{
  "success": true,
  "directories": [],
  "total": 6,
  "page": 1,
  "limit": 50
}
POST /api/admin/directories
Admin Auth & Management

Tambah Direktori Vendor / Tempat Baru (Admin)

Menambahkan entri profil direktori baru langsung dengan status published/terverifikasi oleh admin.

Contoh cURL
curl -X POST "https://eventmedia.my.id/api/admin/directories" \
  -H "Accept: application/json"
Contoh Respons (200 OK)
{
  "success": true,
  "directory": {
    "id": "dir-07",
    "name": "Vendor Audio Pro"
  }
}
Format: JSON
PUT /api/admin/directories/{id}
Admin Auth & Management

Perbarui Data Direktori (Admin)

Memperbarui profil, fasilitas, kontak, status publikasi, dan status unggulan direktori vendor/venue.

Parameter Permintaan
Parameter Lokasi Tipe Wajib Deskripsi
id path string Ya
Contoh cURL
curl -X PUT "https://eventmedia.my.id/api/admin/directories/evt-sample" \
  -H "Accept: application/json"
Contoh Respons (200 OK)
{
  "success": true,
  "directory": {
    "id": "dir-01",
    "name": "Grand Ballroom"
  }
}
Format: JSON
DELETE /api/admin/directories/{id}
Admin Auth & Management

Hapus Direktori (Admin)

Menghapus direktori dari sistem.

Parameter Permintaan
Parameter Lokasi Tipe Wajib Deskripsi
id path string Ya
Contoh cURL
curl -X DELETE "https://eventmedia.my.id/api/admin/directories/evt-sample" \
  -H "Accept: application/json"
Contoh Respons (200 OK)
{
  "success": true
}
Format: JSON
Teks berhasil disalin!