API Data Pariwisata & Ekonomi Kreatif
Akses terprogram ke katalog dataset Dinas Pariwisata & Ekonomi Kreatif Provinsi DKI Jakarta — katalog, isi tabel terpaginasi, pencarian, dan ekspor CSV/XLSX. Seluruh respons berformat JSON.
https://dispar.rantai.devPengantar
API ini menyajikan data yang sama dengan yang tampil di platform — bersumber dari Satu Data Indonesia (SDI) Jakarta dan dataset sekunder internal Dinas, tersinkron ke database platform. Semua endpoint baca bersifat publik tanpa autentikasi; hanya endpoint /api/admin/* yang membutuhkan secret internal.
Respons katalog dan detail di-cache di CDN selama 24 jam (s-maxage=86400, stale-while-revalidate=604800) — gunakan seperlunya dan hindari polling agresif. Setiap respons menyertakan bidang source yang menunjukkan asal data: db, snapshot, atau live.
curl https://dispar.rantai.dev/api/sdi | jq ".count"/api/sdiKatalog dataset
Mengembalikan katalog dataset primer Dinas Pariwisata & Ekonomi Kreatif yang terdaftar di Satu Data Indonesia (SDI) Jakarta. Default membaca dari database platform; jika kosong, jatuh ke snapshot statis.
| Parameter | Letak | Tipe | Keterangan |
|---|---|---|---|
live | query | 0 | 1 | Jika 1, katalog diambil langsung dari API SDI (timeout 20 detik). Gagal → otomatis jatuh ke database/snapshot. |
curl https://dispar.rantai.dev/api/sdi{
"source": "db",
"count": 182,
"datasets": [
{
"id": 3244,
"title": "Data Jumlah Kunjungan Wisatawan Mancanegara",
"description": "Dataset ini berisi jumlah kunjungan wisman …",
"slug": "data-jumlah-kunjungan-wisatawan-mancanegara",
"tags": ["pariwisata", "wisman"],
"views": 1042,
"datasetCount": 12,
"createdAt": "2023-04-11T03:12:00.000Z",
"updatedAt": "2025-11-02T08:40:00.000Z"
}
]
}source bernilai db (database platform), snapshot (cadangan statis), atau live (langsung dari SDI).
Coba di browser/api/sdi/{slug}Detail & baris data
Metadata lengkap plus isi tabel satu dataset — terpaginasi (offset/limit) dan mendukung pencarian sisi server, sehingga dataset puluhan ribu baris tetap ringan. Dataset yang belum tersinkron di database akan di-fetch langsung dari SDI.
| Parameter | Letak | Tipe | Keterangan |
|---|---|---|---|
slugwajib | path | string | Slug dataset dari katalog, mis. data-jumlah-kunjungan-wisatawan-mancanegara. |
offset | query | integer ≥ 0 | Baris pertama yang diambil. Default 0. |
limit | query | integer 1–200 | Jumlah baris per halaman. Default 50, maksimum 200. |
q | query | string | Kata kunci pencarian — dicocokkan ke seluruh kolom (ILIKE) di sisi server. |
curl "https://dispar.rantai.dev/api/sdi/data-jumlah-kunjungan-wisatawan-mancanegara?offset=0&limit=50"{
"source": "db",
"slug": "data-jumlah-kunjungan-wisatawan-mancanegara",
"title": "Data Jumlah Kunjungan Wisatawan Mancanegara",
"description": "Dataset ini berisi …",
"sumberData": ["Dinas Pariwisata dan Ekonomi Kreatif"],
"frekuensi": "Bulanan",
"satuan": "Orang",
"klasifikasi": "Terbuka",
"kontak": "[email protected]",
"author": "Dinas Pariwisata dan Ekonomi Kreatif",
"columns": [
{ "key": "periode_data", "desc": "Periode data", "type": "varchar" },
{ "key": "jumlah_kunjungan", "desc": "Jumlah kunjungan", "type": "bigint" }
],
"rows": [
{ "periode_data": "2025-01", "jumlah_kunjungan": 186220 }
],
"total": 3120,
"count": 3120,
"offset": 0,
"limit": 50
}total = seluruh baris dataset; count = baris yang cocok dengan filter q (dipakai untuk paginasi).
502Dataset tidak ada di database dan fetch live ke SDI gagal./api/sdi/{slug}/exportEkspor CSV / XLSX
Mengunduh seluruh baris satu dataset (tanpa paginasi) sebagai berkas CSV atau Excel. CSV disertai BOM UTF-8 agar karakter beraksen terbaca benar di Excel.
| Parameter | Letak | Tipe | Keterangan |
|---|---|---|---|
slugwajib | path | string | Slug dataset dari katalog. |
format | query | csv | xlsx | Format berkas. Default csv. |
curl -OJ "https://dispar.rantai.dev/api/sdi/data-jumlah-kunjungan-wisatawan-mancanegara/export?format=xlsx"HTTP/1.1 200 OK
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
Content-Disposition: attachment; filename="data-jumlah-kunjungan-wisatawan-mancanegara.xlsx"
Cache-Control: no-storeRespons berupa berkas unduhan (attachment), bukan JSON.
404Dataset tidak ditemukan / gagal diambil dari SDI./api/admin/syncSinkronisasi dataset
Menarik ulang satu dataset (atau semua) dari API SDI ke database platform. Endpoint internal — membutuhkan secret sinkronisasi.
| Parameter | Letak | Tipe | Keterangan |
|---|---|---|---|
x-sync-secretwajib | header | string | Secret sinkronisasi internal. |
slugwajib | query | string | all | Slug dataset yang disinkron, atau all untuk seluruh katalog (durasi panjang — gunakan hati-hati). |
curl -X POST "https://dispar.rantai.dev/api/admin/sync?slug=data-jumlah-kunjungan-wisatawan-mancanegara" \
-H "x-sync-secret: $SYNC_SECRET"{
"synced": 1,
"total": 1,
"results": [
{ "slug": "data-jumlah-kunjungan-wisatawan-mancanegara", "rows": 3120 }
]
}400Parameter slug kosong.401Header x-sync-secret salah atau tidak dikirim./api/admin/reportBangun ulang report
Membangun ulang snapshot report (kesiapan indikator GCI/GPCI, ringkasan baris dataset) dari data mentah, lalu me-revalidate halaman /gci dan /gpci. Jalur berat yang sengaja dipisah dari request pengguna — dipanggil terjadwal atau manual.
| Parameter | Letak | Tipe | Keterangan |
|---|---|---|---|
Authorization | header | Bearer <token> | Token cron terjadwal (env CRON_SECRET). |
x-sync-secret | header | string | Alternatif otentikasi manual (env SYNC_SECRET). |
curl -X POST https://dispar.rantai.dev/api/admin/report \
-H "x-sync-secret: $SYNC_SECRET"{
"ok": true,
"indicators": 28,
"rowSnapshots": 98
}401Tidak ada kredensial valid (cron maupun manual).500buildReports() gagal — detail di properti error.Kode status
API memakai kode status HTTP standar. Galat selalu dikembalikan sebagai JSON dengan properti error (dan detail bila tersedia).
200Berhasil.400Parameter tidak valid atau kurang (mis. slug kosong pada sync).401Kredensial admin salah / tidak dikirim.404Dataset tidak ditemukan (ekspor).500Kesalahan internal saat membangun report.502Sumber data hulu (SDI) tidak dapat dijangkau.{
"error": "Gagal mengambil data dari SDI",
"detail": "AbortError: The operation was aborted"
}