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:
| Dokumen | Isi |
|---|---|
| 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.
Mulai cepat
Hubungi admin PAPEDA untuk token (diawali pbk_) dan kunci publik. Token bersifat rahasia.
Impor koleksi Postman, isi alamat dan token, lalu jalankan. Lima pemeriksaan otomatis harus lulus.
Pilih contoh: PHP cURL satu berkas, PHP native lengkap, atau kelas PHP siap pakai.
Alamat dasar PAPEDA ini: https://sdmtvripapua.com
Referensi API
Alamat
| Permintaan | Hasil |
|---|---|
GET/api/bkdh/v1/identity | dokumen identitas terbaru |
GET/api/bkdh/v1/schedule?month=2026-10 | dokumen jadwal bulan itu (YYYY-MM) |
Header
| Arah | Header | Isi |
|---|---|---|
| Permintaan | Authorization | Bearer pbk_… (token Anda) |
| Permintaan | Accept | application/json |
| Jawaban | Content-Type | application/json |
| Jawaban | X-Signature | tanda tangan Ed25519 atas isi jawaban, base64 |
| Jawaban | X-Key-Id | nama kunci, mis. papeda-2026-1; sama dengan key_id di dokumen |
Kode jawaban
| Kode | Arti |
|---|---|
| 200 | dokumen terkirim; badan jawaban = dokumen apa adanya |
| 400 | month bukan YYYY-MM |
| 401 | missing_token: token tidak sampai ke PAPEDA · unknown_token: token tidak dikenal |
| 403 | token dicabut, cakupan token tidak mencakup dokumen itu, atau bukan HTTPS |
| 404 | dokumen bulan itu belum diterbitkan |
| 429 | lebih dari 60 permintaan per jam per token |
Aturan penting
- Periksa tanda tangan dulu, baru
json_decode. Tanda tangan berlaku untuk teks persis yang dikirim. sequenceselalu 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_idsebagai 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)
| Kolom | Isi |
|---|---|
units[] | code (stabil, mis. SIARAN_LOKAL), name, active |
persons[].external_id | UUID pegawai di PAPEDA, tidak pernah berubah |
number, number_type | NIP (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_type | PNS, PPPK, KONTRAK, HONORER |
name | nama pegawai |
unit_code | kode unit kelompok, atau null |
active, effective_from | aktif 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)
| Kolom | Isi |
|---|---|
month | bulan 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_days | jumlah 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_id | Kunci 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
- Unduh koleksi di bawah, lalu di Postman klik Import dan pilih berkasnya.
- Klik nama koleksi › tab Variables: isi
baseUrl=https://sdmtvripapua.com,token= token Anda,bulan= mis.2026-11. Isi kolom Current value, lalu Save. - Klik kanan koleksi › Run collection › Run.
| Permintaan | Hasil yang benar |
|---|---|
| 1. Identitas | 200, header X-Signature dan X-Key-Id ada |
| 2. Jadwal bulanan | 200, setiap orang punya isian sebanyak jumlah hari |
| 3. Tanpa token | 401 (memang harus ditolak) |
| 4. Bulan salah bentuk | 400 |
| 5. Bulan belum terbit | 404 |
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/).
- Unggah
cek.php, buka di browser; semua harus [OK]. Hapus setelahnya. - Isi bagian PENGATURAN di
ambil-curl.php: alamat PAPEDA, token, kunci publik, kata rahasia. - Buka
ambil-curl.php?kunci=KATA_RAHASIAuntuk identitas, tambahkan&bulan=2026-11untuk jadwal. - Pastikan
papeda-data/identitas.jsontidak 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 pegawaiMemeriksa 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.
| Berkas | Fungsi |
|---|---|
config.php | alamat PAPEDA, token, kunci publik, kata rahasia, database (diubah) |
papeda.php | fungsi papeda_ambil(), papeda_baca(), verifikasi, pemeriksaan isi |
ambil.php | ambil identitas + jadwal bulan ini & depan (?kunci=…) |
index.php | contoh halaman tampilan |
impor-mysql.php, skema.sql | memasukkan ke tabel papeda_pegawai, papeda_jadwal, papeda_penghubung |
Langkah pemasangan
- Ekstrak zip; unggah folder
php-nativeke hosting aplikasi Anda (boleh diganti nama). - Isi
config.php: alamat PAPEDA, token, kunci publik dari bagian Kunci publik, dan kata rahasia untukambil.php. - Buka
ambil.php?kunci=KATA_RAHASIA. Hasilnya tersimpan di folderdata/(sudah dilindungi.htaccess). - Buka
index.phpuntuk melihat tabel pegawai dan jadwal. - Bila ingin ke MySQL: jalankan
skema.sqldi phpMyAdmin, isi bagian database diconfig.php, lalu bukaimpor-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
| Gejala | Penyebab | Pemecahan |
|---|---|---|
401 missing_token | header Authorization tidak sampai | cek token di pengaturan; di Postman pilih Inherit auth from parent |
401 unknown_token | token salah salin / dari server lain | salin ulang tanpa spasi |
| 403 | token dicabut atau cakupan kurang (token Portal hanya identitas) | minta token/cakupan ke admin PAPEDA |
| 404 | bulan belum diterbitkan | pakai bulan dekat, atau minta admin menerbitkan |
| 429 | terlalu sering | tunggu 10 menit, kurangi frekuensi |
| Tanda tangan tidak sah | kunci publik salah, atau isi diformat ulang sebelum diperiksa | salin kunci dari bagian Kunci publik; periksa teks mentah |
key_id tidak dikenal | PAPEDA memutar kunci | tambahkan kunci baru dari bagian Kunci publik |
SSL certificate problem | sertifikat tidak dikenali hosting Anda | perbarui ca-certificates; jangan matikan pemeriksaan SSL |
undefined function sodium_… / curl_init | ekstensi belum aktif | cPanel › Select PHP Version › Extensions |
sequence tidak berubah | data PAPEDA memang belum berubah | bukan galat |
Untuk admin PAPEDA
- Buka Master Data › Pembaruan Database, tekan Jalankan pembaruan (sekali setelah memasang paket).
- Buka Master Data › Integrasi BKDH & Portal › Buat kunci.
- Buat token per aplikasi (BKDH: identitas + jadwal; Portal: identitas). Token tampil sekali; serahkan langsung ke admin aplikasi itu.
- 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}]