Beranda Panduan API

Panduan API PAPEDA

Cara aplikasi lain (BKDH, Portal Surat Teknik, dan aplikasi internal TVRI Papua) membaca data identitas pegawai dan jadwal bulanan dari PAPEDA secara aman.

Ringkasan

PAPEDA adalah sumber data pegawai, jadwal, dan hari libur TVRI Stasiun Papua. Aplikasi lain tidak menyalin data itu dengan tangan, tetapi mengambilnya dari PAPEDA lewat dua alamat baca saja:

DokumenIsi
Identitas (C1)daftar pegawai aktif dan yang baru berhenti: UUID, NIP, jenis kepegawaian, nama, unit, status aktif
Jadwal (C2)jadwal satu bulan per pegawai (M masuk, L libur, C cuti), tanggal merah, dan jumlah hari kerja kantor

Setiap dokumen ditandatangani secara digital (Ed25519). Aplikasi Anda memeriksa tanda tangan itu dengan kunci publik PAPEDA, sehingga data yang diubah di tengah jalan langsung ketahuan. Akses memakai token per aplikasi yang diberikan admin PAPEDA.

Data pribadi seperti NIK, tanggal lahir, alamat, telepon, email, golongan, jabatan, tunjangan, dan alasan cuti tidak pernah dikirim lewat API ini.

Mulai cepat

1Minta akses

Hubungi admin PAPEDA untuk token (diawali pbk_) dan kunci publik. Token bersifat rahasia.

2Uji dulu

Impor koleksi Postman, isi alamat dan token, lalu jalankan. Lima pemeriksaan otomatis harus lulus.

3Pasang di aplikasi

Pilih contoh: PHP cURL satu berkas, PHP native lengkap, atau kelas PHP siap pakai.

Alamat dasar PAPEDA ini: https://sdmtvripapua.com

Referensi API

Alamat

PermintaanHasil
GET/api/bkdh/v1/identitydokumen identitas terbaru
GET/api/bkdh/v1/schedule?month=2026-10dokumen jadwal bulan itu (YYYY-MM)

Header

ArahHeaderIsi
PermintaanAuthorizationBearer pbk_… (token Anda)
PermintaanAcceptapplication/json
JawabanContent-Typeapplication/json
JawabanX-Signaturetanda tangan Ed25519 atas isi jawaban, base64
JawabanX-Key-Idnama kunci, mis. papeda-2026-1; sama dengan key_id di dokumen

Kode jawaban

KodeArti
200dokumen terkirim; badan jawaban = dokumen apa adanya
400month bukan YYYY-MM
401missing_token: token tidak sampai ke PAPEDA · unknown_token: token tidak dikenal
403token dicabut, cakupan token tidak mencakup dokumen itu, atau bukan HTTPS
404dokumen bulan itu belum diterbitkan
429lebih dari 60 permintaan per jam per token

Aturan penting

  • Periksa tanda tangan dulu, baru json_decode. Tanda tangan berlaku untuk teks persis yang dikirim.
  • sequence selalu naik. Tolak dokumen yang nomornya lebih kecil dari yang sudah Anda simpan; nomor sama berarti tidak ada perubahan.
  • Tolak dokumen yang lebih tua dari 45 hari (lihat generated_at).
  • Pakai external_id sebagai pengenal pegawai. Nilainya tidak pernah berubah. Jangan membuat akun pengguna otomatis dari berkas.
  • PAPEDA menerbitkan ulang otomatis saat diambil bila datanya berubah, jadi mengambil sekali sehari sudah cukup.

Isi dokumen

Semua dokumen diawali kolom kepala yang sama, berurutan: contract, contract_version, source ("papeda"), key_id, snapshot_id, sequence, generated_at (UTC). Kolom di luar daftar di bawah tidak pernah ada.

Identitas (C1)

KolomIsi
units[]code (stabil, mis. SIARAN_LOKAL), name, active
persons[].external_idUUID pegawai di PAPEDA, tidak pernah berubah
number, number_typeNIP (hanya angka); jenis NIP, NIP3K (PPPK), NIPEG (kontrak). Opsional: SPK untuk pegawai kontrak tanpa NIPEG, number berisi nomor SPK (mis. 63/SPK/TVRI/2023) — hanya bila diaktifkan
employment_typePNS, PPPK, KONTRAK, HONORER
namenama pegawai
unit_codekode unit kelompok, atau null
active, effective_fromaktif atau berhenti; tanggal berlaku (YYYY-MM-DD)
{"contract":"identity","contract_version":1,"source":"papeda","key_id":"papeda-2026-1",
 "snapshot_id":"2026-10-13-01","sequence":3,"generated_at":"2026-10-13T03:04:05Z",
 "units":[{"code":"SIARAN_LOKAL","name":"Siaran Lokal","active":true}],
 "persons":[{"external_id":"00000000-0000-4000-8000-000000000001","number":"111111111111111111",
   "number_type":"NIP","employment_type":"PNS","name":"Pegawai Contoh 1",
   "unit_code":"SIARAN_LOKAL","active":true,"effective_from":"2026-10-01"}]}

Jadwal (C2)

KolomIsi
monthbulan dokumen, YYYY-MM
entries[]external_id + days: satu isian per tanggal, "M" masuk, "L" libur, "C" cuti, null belum diisi
holidays[]date, kind (NATIONAL, JOINT_LEAVE, REGIONAL), name
office_working_daysjumlah hari kerja kantor bulan itu
{"contract":"schedule","contract_version":1,"source":"papeda","key_id":"papeda-2026-1",
 "snapshot_id":"2026-10-r2","sequence":2,"generated_at":"2026-10-13T03:04:05Z",
 "month":"2026-10",
 "entries":[{"external_id":"00000000-0000-4000-8000-000000000001",
   "days":["M","M","L","L","M","C",null, ...31 isian...]}],
 "holidays":[{"date":"2026-10-20","kind":"REGIONAL","name":"Libur Contoh"}],
 "office_working_days":21}

Kunci publik

Kunci publik dipakai untuk memeriksa tanda tangan. Kunci ini tidak rahasia; yang rahasia hanya token.

key_idKunci publik (base64)Status
papeda-2026-1 1eV8OdBBksMFkp5dupMwFTrchDWWjrAcfpkc7+nb+/Q= Aktif

Bila PAPEDA memutar kunci, kunci baru muncul di sini. Tambahkan ke aplikasi Anda tanpa menghapus kunci lama sampai admin PAPEDA mengumumkannya pensiun.

Uji dengan Postman

  1. Unduh koleksi di bawah, lalu di Postman klik Import dan pilih berkasnya.
  2. Klik nama koleksi › tab Variables: isi baseUrl = https://sdmtvripapua.com, token = token Anda, bulan = mis. 2026-11. Isi kolom Current value, lalu Save.
  3. Klik kanan koleksi › Run collection › Run.
PermintaanHasil yang benar
1. Identitas200, header X-Signature dan X-Key-Id ada
2. Jadwal bulanan200, setiap orang punya isian sebanyak jumlah hari
3. Tanpa token401 (memang harus ditolak)
4. Bulan salah bentuk400
5. Bulan belum terbit404

Postman tidak bisa memeriksa tanda tangan Ed25519. Simpan jawaban (Save Response › Save to a file) lalu periksa dengan skrip verifikasi.

PHP cURL (satu berkas)

Paling sederhana untuk hosting cPanel biasa. Isi paket: cek.php (memeriksa PHP, ekstensi curl/sodium, dan koneksi ke PAPEDA) dan ambil-curl.php (mengambil, memeriksa tanda tangan, menyimpan ke folder papeda-data/).

  1. Unggah cek.php, buka di browser; semua harus [OK]. Hapus setelahnya.
  2. Isi bagian PENGATURAN di ambil-curl.php: alamat PAPEDA, token, kunci publik, kata rahasia.
  3. Buka ambil-curl.php?kunci=KATA_RAHASIA untuk identitas, tambahkan &bulan=2026-11 untuk jadwal.
  4. Pastikan papeda-data/identitas.json tidak bisa dibuka dari browser (harus 403).

Inti pemanggilan

<?php
$ch = curl_init('https://sdmtvripapua.com/api/bkdh/v1/identity');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: Bearer pbk_xxxx', 'Accept: application/json']);
$badan = curl_exec($ch);
$kode  = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);

echo $kode;                        // 200 bila berhasil
$data = json_decode($badan, true); // $data['persons'] = daftar pegawai

Memeriksa tanda tangan

<?php
// $badan = isi jawaban apa adanya; $sig = header X-Signature; $keyId = header X-Key-Id
$kunciPublik = ['papeda-2026-1' => 'BASE64_KUNCI_PUBLIK'];

$sah = sodium_crypto_sign_verify_detached(
    base64_decode($sig),
    $badan,                                  // JANGAN di-json_decode/encode dulu
    base64_decode($kunciPublik[$keyId])
);
if (! $sah) {
    exit('Tanda tangan tidak sah, data dibuang.');
}
$data = json_decode($badan, true);

PHP native (lengkap)

Aplikasi contoh tanpa framework: mengambil, memeriksa, menyimpan, menampilkan tabel pegawai dan jadwal berwarna, serta mengimpor ke MySQL.

BerkasFungsi
config.phpalamat PAPEDA, token, kunci publik, kata rahasia, database (diubah)
papeda.phpfungsi papeda_ambil(), papeda_baca(), verifikasi, pemeriksaan isi
ambil.phpambil identitas + jadwal bulan ini & depan (?kunci=…)
index.phpcontoh halaman tampilan
impor-mysql.php, skema.sqlmemasukkan ke tabel papeda_pegawai, papeda_jadwal, papeda_penghubung

Langkah pemasangan

  1. Ekstrak zip; unggah folder php-native ke hosting aplikasi Anda (boleh diganti nama).
  2. Isi config.php: alamat PAPEDA, token, kunci publik dari bagian Kunci publik, dan kata rahasia untuk ambil.php.
  3. Buka ambil.php?kunci=KATA_RAHASIA. Hasilnya tersimpan di folder data/ (sudah dilindungi .htaccess).
  4. Buka index.php untuk melihat tabel pegawai dan jadwal.
  5. Bila ingin ke MySQL: jalankan skema.sql di phpMyAdmin, isi bagian database di config.php, lalu buka impor-mysql.php?kunci=KATA_RAHASIA.

Memakai dari halaman Anda sendiri

<?php
require __DIR__ . '/php-native/config.php';
require __DIR__ . '/php-native/papeda.php';

$hasil   = papeda_ambil('schedule', date('Y-m'));   // ambil + verifikasi + simpan
$pegawai = papeda_baca('identity');                 // baca yang sudah tersimpan
$jadwal  = papeda_baca('schedule', date('Y-m'));

Kelas PHP siap pakai

PapedaKlien.php berisi satu kelas tanpa pustaka tambahan yang menjalankan semua pemeriksaan kontrak (kolom, tipe, kunci ganda, sequence, umur dokumen). Cocok untuk aplikasi berbasis framework (Laravel, CodeIgniter, dll.).

<?php
require 'PapedaKlien.php';

$klien = new PapedaKlien('https://sdmtvripapua.com', 'pbk_xxxx', ['papeda-2026-1' => 'BASE64_KUNCI_PUBLIK']);

try {
    $c1 = $klien->identitas();          // daftar pegawai, sudah diverifikasi & diperiksa
    $c2 = $klien->jadwal('2026-10');    // jadwal satu bulan
    foreach ($c2['dokumen']['entries'] as $e) {
        $tgl1 = $e['days'][0];          // 'M', 'L', 'C' atau null
    }
} catch (PapedaGalat $e) {
    echo $e->getMessage() . ' (HTTP ' . $e->getCode() . ')';
}

Ambil otomatis (cron)

Tidak perlu terminal. Di cPanel aplikasi Anda buka Cron Jobs, pilih sekali sehari (mis. pukul 06.15), dan buat satu cron job per baris berikut:

wget -q -O /dev/null "https://aplikasi-anda/ambil-curl.php?kunci=KATA_RAHASIA"
wget -q -O /dev/null "https://aplikasi-anda/ambil-curl.php?kunci=KATA_RAHASIA&bulan=$(date +\%Y-\%m)"

Untuk contoh PHP native, ganti alamatnya dengan ambil.php?kunci=…. Jangan lebih dari 60 permintaan per jam per token.

Masalah umum

GejalaPenyebabPemecahan
401 missing_tokenheader Authorization tidak sampaicek token di pengaturan; di Postman pilih Inherit auth from parent
401 unknown_tokentoken salah salin / dari server lainsalin ulang tanpa spasi
403token dicabut atau cakupan kurang (token Portal hanya identitas)minta token/cakupan ke admin PAPEDA
404bulan belum diterbitkanpakai bulan dekat, atau minta admin menerbitkan
429terlalu seringtunggu 10 menit, kurangi frekuensi
Tanda tangan tidak sahkunci publik salah, atau isi diformat ulang sebelum diperiksasalin kunci dari bagian Kunci publik; periksa teks mentah
key_id tidak dikenalPAPEDA memutar kuncitambahkan kunci baru dari bagian Kunci publik
SSL certificate problemsertifikat tidak dikenali hosting Andaperbarui ca-certificates; jangan matikan pemeriksaan SSL
undefined function sodium_… / curl_initekstensi belum aktifcPanel › Select PHP Version › Extensions
sequence tidak berubahdata PAPEDA memang belum berubahbukan galat

Untuk admin PAPEDA

  1. Buka Master Data › Pembaruan Database, tekan Jalankan pembaruan (sekali setelah memasang paket).
  2. Buka Master Data › Integrasi BKDH & Portal › Buat kunci.
  3. Buat token per aplikasi (BKDH: identitas + jadwal; Portal: identitas). Token tampil sekali; serahkan langsung ke admin aplikasi itu.
  4. Dokumen terbit otomatis saat diambil. Tombol Terbitkan hanya untuk menerbitkan lebih awal; Catatan akses menampilkan setiap pengambilan.

Bila konsumen selalu mendapat 401 missing_token padahal token benar, hosting membuang header Authorization. Tambahkan ke .htaccess folder publik PAPEDA:

RewriteEngine On
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]