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 (Fetch) Upload File & Verifikasi Resolusi CDN:
const formData = new FormData();
formData.append('file', fileInput.files[0]);

// 1. Upload file ke endpoint CDN
const res = await fetch('https://cfcdn.aksisoft.my.id/index.php', {
  method: 'POST',
  body: formData
});
const result = await res.json();
const uploadedImageUrl = result.data?.url || result.url;

// 2. Tunggu 5 - 10 detik masa resolusi CDN sebelum menampilkan preview
await new Promise(resolve => setTimeout(resolve, 5000));

// 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

17 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
page query integer Tidak Nomor halaman (mulai dari 1).
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"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 12,
    "total": 42,
    "total_pages": 4,
    "has_next": true,
    "has_prev": false,
    "next_page": 2,
    "prev_page": null
  }
}
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"
  }
}
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 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_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
Teks berhasil disalin!