Dokumentasi · REST API · v1

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.

Base URLhttps://dispar.rantai.dev
5 endpointJSONBaca publik tanpa autentikasi

Pengantar

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.

Contoh tercepat
curl https://dispar.rantai.dev/api/sdi | jq ".count"
GET/api/sdi

Katalog 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.

Cache: CDN 24 jam · stale-while-revalidate 7 hari
Parameter
ParameterLetakTipeKeterangan
livequery0 | 1Jika 1, katalog diambil langsung dari API SDI (timeout 20 detik). Gagal → otomatis jatuh ke database/snapshot.
Permintaan
curl https://dispar.rantai.dev/api/sdi
Respons 200
{
  "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
GET/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.

Cache: CDN 24 jam (dinonaktifkan saat memakai parameter q)
Parameter
ParameterLetakTipeKeterangan
slugwajibpathstringSlug dataset dari katalog, mis. data-jumlah-kunjungan-wisatawan-mancanegara.
offsetqueryinteger ≥ 0Baris pertama yang diambil. Default 0.
limitqueryinteger 1–200Jumlah baris per halaman. Default 50, maksimum 200.
qquerystringKata kunci pencarian — dicocokkan ke seluruh kolom (ILIKE) di sisi server.
Permintaan
curl "https://dispar.rantai.dev/api/sdi/data-jumlah-kunjungan-wisatawan-mancanegara?offset=0&limit=50"
Respons 200
{
  "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.
Coba di browser
GET/api/sdi/{slug}/export

Ekspor 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
ParameterLetakTipeKeterangan
slugwajibpathstringSlug dataset dari katalog.
formatquerycsv | xlsxFormat berkas. Default csv.
Permintaan
curl -OJ "https://dispar.rantai.dev/api/sdi/data-jumlah-kunjungan-wisatawan-mancanegara/export?format=xlsx"
Respons (header)
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-store

Respons berupa berkas unduhan (attachment), bukan JSON.

404Dataset tidak ditemukan / gagal diambil dari SDI.
POST/api/admin/sync

Sinkronisasi dataset

Menarik ulang satu dataset (atau semua) dari API SDI ke database platform. Endpoint internal — membutuhkan secret sinkronisasi.

Autentikasi. Header x-sync-secret wajib dan harus sama dengan env SYNC_SECRET.
Parameter
ParameterLetakTipeKeterangan
x-sync-secretwajibheaderstringSecret sinkronisasi internal.
slugwajibquerystring | allSlug dataset yang disinkron, atau all untuk seluruh katalog (durasi panjang — gunakan hati-hati).
Permintaan
curl -X POST "https://dispar.rantai.dev/api/admin/sync?slug=data-jumlah-kunjungan-wisatawan-mancanegara" \
  -H "x-sync-secret: $SYNC_SECRET"
Respons 200
{
  "synced": 1,
  "total": 1,
  "results": [
    { "slug": "data-jumlah-kunjungan-wisatawan-mancanegara", "rows": 3120 }
  ]
}
400Parameter slug kosong.
401Header x-sync-secret salah atau tidak dikirim.
GETPOST/api/admin/report

Bangun 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.

Autentikasi. Salah satu: Authorization: Bearer $CRON_SECRET (cron) atau header x-sync-secret (manual).
Parameter
ParameterLetakTipeKeterangan
AuthorizationheaderBearer <token>Token cron terjadwal (env CRON_SECRET).
x-sync-secretheaderstringAlternatif otentikasi manual (env SYNC_SECRET).
Permintaan
curl -X POST https://dispar.rantai.dev/api/admin/report \
  -H "x-sync-secret: $SYNC_SECRET"
Respons 200
{
  "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.
Bentuk galat
{
  "error": "Gagal mengambil data dari SDI",
  "detail": "AbortError: The operation was aborted"
}