{"openapi":"3.1.0","info":{"title":"SDGs UNSRI — Open Data API","version":"2.0.0","summary":"Akses publik ke seluruh data SDGs Universitas Sriwijaya.","description":"API data terbuka Sistem Informasi SDGs Universitas Sriwijaya.\n\nSeluruh data yang dikelola sistem ini — bukti dukung SDG, publikasi ilmiah, hasil panen berita,\nkebijakan, konten microsite, hasil klasifikasi NLP, data monitoring & evaluasi, hierarki\norganisasi, hingga ringkasan dashboard — dapat dibaca lewat API ini.\n\n## Autentikasi: opsional\n\n**Semua endpoint baca bisa dipanggil tanpa token.** Token tidak membuka data yang tertutup —\nia hanya menaikkan kuota dan memberi identitas pada pemanggil:\n\n| | Tanpa token | Dengan token |\n|---|---|---|\n| Per menit | 60 | 240 (bisa dinaikkan) |\n| Per hari | 2.000 | 20.000 |\n| Dihitung per | Alamat IP | Token |\n\nTerbitkan token gratis lewat `POST /api/v2/tokens` atau halaman [/api/token](/api/token),\nlalu kirimkan dengan salah satu cara berikut:\n\n```\nAuthorization: Bearer sdg_live_xxx…     ← disarankan\nX-API-Key: sdg_live_xxx…\n?api_key=sdg_live_xxx…                  ← untuk spreadsheet/browser yang tak bisa kirim header\n```\n\n## Bentuk jawaban\n\nSetiap jawaban memakai amplop yang sama, sukses maupun gagal:\n\n```json\n{ \"success\": true, \"data\": [ … ], \"pagination\": { … }, \"filters\": { … }, \"meta\": { … } }\n{ \"success\": false, \"error\": { \"code\": \"rate_limited\", \"message\": \"…\" } }\n```\n\nBercabanglah pada `error.code` (stabil), bukan pada `error.message` (bisa berubah redaksinya).\n\n## Yang perlu diketahui sebelum menarik kesimpulan\n\n- **Status bawaan adalah yang sudah disahkan.** `/evidence` dan `/monev/achievements` default\n  `verified`; `/news` default `published`. Tambahkan `status=all` untuk melihat data yang\n  masih dalam proses — sadari bahwa isinya belum tentu benar.\n- **Periksa kesegaran data** lewat `/ops/pipeline-status` sebelum menyimpulkan tren tahun\n  berjalan. Angka yang terlihat turun sering berarti panen terakhir sudah lama.\n- **Data pribadi tidak disiarkan.** Email, NIP, kata sandi, dan data kepegawaian tidak pernah\n  muncul di API ini, sekalipun kolomnya ada di database.\n\n## Unduh sebagai CSV\n\nHampir semua endpoint daftar menerima `?format=csv` dan mengembalikan berkas siap buka di\nExcel (UTF-8 dengan BOM). Kolom bersarang diratakan menjadi `sdg.number`, `faculty.code`,\ndan seterusnya.\n\n## Batas & sopan santun\n\nKuota tercermin di header setiap jawaban: `X-RateLimit-Limit`, `X-RateLimit-Remaining`,\n`X-RateLimit-Reset`, `X-RateLimit-Daily-Remaining`. Saat kena batas, API menjawab `429`\ndisertai `retry_after` dalam detik — hormati angka itu daripada mencoba ulang segera.\n\nUntuk penarikan data besar, gunakan paginasi `per_page=200` dan beri jeda antarpanggilan,\natau minta kenaikan kuota lewat kontak di bawah.","contact":{"name":"Tim SDGs Universitas Sriwijaya","email":"sdg@unsri.ac.id","url":"https://www.unsri.ac.id"},"license":{"name":"CC BY 4.0","url":"https://creativecommons.org/licenses/by/4.0/"}},"servers":[{"url":"http://wcu.unsri.ac.id/api/v2","description":"Host yang sedang diakses"},{"url":"http://localhost:3200/api/v2","description":"URL aplikasi terkonfigurasi (APP_URL)"}],"externalDocs":{"description":"Dokumentasi interaktif","url":"/api/v2/docs"},"tags":[{"name":"Meta","description":"Indeks, kesehatan, katalog dataset, dan spesifikasi ini sendiri."},{"name":"Dashboard","description":"Angka siap-pakai: ringkasan, sebaran per SDG, kinerja fakultas, tren."},{"name":"Tujuan SDG","description":"17 tujuan, subkategori, dan kamus kata kunci klasifikasi."},{"name":"Bukti Dukung","description":"Bukti kegiatan SDG yang diinput dan diverifikasi internal."},{"name":"Publikasi","description":"Publikasi ilmiah dosen, penulis, dan pemetaan SDG-nya."},{"name":"Berita & Web","description":"Bukti hasil panen web beserta skor relevansinya."},{"name":"Kebijakan","description":"Kebijakan universitas dan pemetaan SDG."},{"name":"Monev","description":"Kerangka, indikator, target, capaian, dan evaluasi monitoring."},{"name":"Organisasi","description":"Fakultas, jurusan, program studi, unit kemahasiswaan."},{"name":"Kontributor","description":"Profil publik kontributor dan pengenal riset eksternal."},{"name":"Konten","description":"Artikel, agenda, dokumen, dan materi microsite."},{"name":"NLP","description":"Prediksi klasifikasi SDG oleh mesin dan hasil evaluasinya."},{"name":"Operasional","description":"Metadata pipeline: kesegaran data, riwayat panen, pemakaian API."},{"name":"Token","description":"Menerbitkan, memeriksa, merotasi, dan mencabut token API."}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]},{"apiKeyQuery":[]},{}],"paths":{"/":{"get":{"tags":["Meta"],"operationId":"apiIndex","summary":"Indeks API","description":"Daftar seluruh kelompok endpoint beserta tautannya. Titik awal penjelajahan tanpa membaca dokumen ini.","responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}}}}},"/health":{"get":{"tags":["Meta"],"operationId":"health","summary":"Status kesehatan API","description":"Cek koneksi database dan waktu server. Cocok untuk uptime monitor.","responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"503":{"description":"Database tidak dapat dihubungi","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/datasets":{"get":{"tags":["Meta"],"operationId":"datasets","summary":"Katalog dataset","description":"Semua dataset yang tersedia, jumlah barisnya saat ini, tabel sumbernya, dan endpoint pengaksesnya.","responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/Dataset"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}}}}},"/openapi.json":{"get":{"tags":["Meta"],"operationId":"openapiJson","summary":"Spesifikasi OpenAPI (JSON)","description":"Dokumen ini sendiri. Impor ke Postman, Insomnia, Swagger Editor, atau generator klien.","responses":{"200":{"description":"Dokumen OpenAPI 3.1","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/sdgs":{"get":{"tags":["Tujuan SDG"],"operationId":"listSdgs","summary":"Daftar 17 tujuan SDG","description":"Kunci penerjemah untuk seluruh dataset lain — setiap `sdg_number` di API ini merujuk ke sini. Menyertakan jumlah bukti, publikasi, dan kebijakan per tujuan.","parameters":[{"$ref":"#/components/parameters/format"}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/Sdg"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/sdgs/{number}":{"get":{"tags":["Tujuan SDG"],"operationId":"getSdg","summary":"Detail satu tujuan SDG","description":"Termasuk seluruh subkategori dan kamus kata kunci yang dipakai mesin klasifikasi untuk tujuan ini.","parameters":[{"name":"number","in":"path","required":true,"description":"Nomor SDG 1–17.","schema":{"type":"integer","minimum":1,"maximum":17}}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"$ref":"#/components/schemas/SdgDetail"},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Tidak ditemukan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/sdg-subcategories":{"get":{"tags":["Tujuan SDG"],"operationId":"listSubcategories","summary":"Daftar subkategori SDG","description":"Rincian target di bawah tiap tujuan (mis. 4.3, 4.4).","parameters":[{"$ref":"#/components/parameters/format"},{"$ref":"#/components/parameters/sdg"},{"$ref":"#/components/parameters/search"}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/SdgSubcategory"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/sdg-keywords":{"get":{"tags":["Tujuan SDG"],"operationId":"listKeywords","summary":"Kamus kata kunci klasifikasi","description":"Kata kunci berbobot yang dipakai mesin relevansi internal. Dibuka supaya skor relevansi di dataset berita bisa direproduksi dan diaudit pihak luar.","parameters":[{"$ref":"#/components/parameters/page"},{"$ref":"#/components/parameters/perPage"},{"$ref":"#/components/parameters/format"},{"$ref":"#/components/parameters/sdg"},{"name":"language","in":"query","description":"Kode bahasa, mis. `id` atau `en`.","schema":{"type":"string"}},{"name":"active","in":"query","description":"Hanya kata kunci aktif.","schema":{"type":"boolean"}},{"$ref":"#/components/parameters/search"}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/SdgKeyword"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/faculties":{"get":{"tags":["Organisasi"],"operationId":"listFaculties","summary":"Daftar fakultas","description":"Sepuluh fakultas UNSRI beserta cakupan SDG masing-masing.","parameters":[{"$ref":"#/components/parameters/format"}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/Faculty"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/faculties/{idOrCode}":{"get":{"tags":["Organisasi"],"operationId":"getFaculty","summary":"Detail fakultas","description":"Menerima id numerik maupun kode fakultas (`FASILKOM`). Menyertakan daftar jurusan, prodi, dan sebaran bukti per SDG.","parameters":[{"name":"idOrCode","in":"path","required":true,"description":"Id numerik atau kode fakultas.","schema":{"type":"string"}}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"$ref":"#/components/schemas/FacultyDetail"},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Tidak ditemukan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/jurusan":{"get":{"tags":["Organisasi"],"operationId":"listJurusan","summary":"Daftar jurusan","parameters":[{"$ref":"#/components/parameters/format"},{"name":"faculty_id","in":"query","description":"Saring per id fakultas.","schema":{"type":"integer"}},{"$ref":"#/components/parameters/search"}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/Jurusan"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/prodi":{"get":{"tags":["Organisasi"],"operationId":"listProdi","summary":"Daftar program studi","parameters":[{"$ref":"#/components/parameters/format"},{"name":"faculty_id","in":"query","description":"Id fakultas.","schema":{"type":"integer"}},{"name":"jurusan_id","in":"query","description":"Id jurusan.","schema":{"type":"integer"}},{"name":"degree_level","in":"query","description":"Jenjang.","schema":{"type":"string","enum":["D3","D4","S1","S2","S3","Profesi"]}},{"$ref":"#/components/parameters/search"}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/Prodi"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/org-units":{"get":{"tags":["Organisasi"],"operationId":"listOrgUnits","summary":"Unit kemahasiswaan (BEM/HIMA/UKM)","parameters":[{"$ref":"#/components/parameters/format"},{"name":"type","in":"query","description":"Jenis unit.","schema":{"type":"string","enum":["bem","hima","dema","ukm","other"]}},{"name":"faculty_id","in":"query","description":"Id fakultas.","schema":{"type":"integer"}}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/OrgUnit"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/evidence":{"get":{"tags":["Bukti Dukung"],"operationId":"listEvidence","summary":"Daftar bukti dukung SDG","description":"Bukti yang diinput dan diverifikasi internal universitas.\n\n**Default `status=verified`.** Baris draft/submitted/rejected adalah pekerjaan yang belum disahkan pemiliknya; tersedia lewat `status=all` bila memang ingin melihat prosesnya.\n\nPengurutan: `created_at`, `updated_at`, `year`, `title`, `verified_at`, `sdg`.","parameters":[{"$ref":"#/components/parameters/page"},{"$ref":"#/components/parameters/perPage"},{"$ref":"#/components/parameters/format"},{"$ref":"#/components/parameters/sdg"},{"$ref":"#/components/parameters/facultyCode"},{"name":"faculty_id","in":"query","description":"Id fakultas.","schema":{"type":"integer"}},{"name":"jurusan_id","in":"query","description":"Id jurusan.","schema":{"type":"integer"}},{"name":"prodi_id","in":"query","description":"Id prodi.","schema":{"type":"integer"}},{"name":"org_unit_id","in":"query","description":"Id unit kemahasiswaan.","schema":{"type":"integer"}},{"$ref":"#/components/parameters/year"},{"name":"year_from","in":"query","description":"Tahun mulai.","schema":{"type":"integer"}},{"name":"year_to","in":"query","description":"Tahun akhir.","schema":{"type":"integer"}},{"name":"subcategory","in":"query","description":"Kode subkategori, mis. `4.3`.","schema":{"type":"string"}},{"name":"status","in":"query","description":"Status verifikasi.","schema":{"type":"string","enum":["verified","draft","submitted","rejected","all"],"default":"verified"}},{"name":"the_curated","in":"query","description":"Hanya bukti pilihan THE Impact Rankings.","schema":{"type":"boolean"}},{"name":"owner_level","in":"query","description":"Tingkat pemilik.","schema":{"type":"string","enum":["university","faculty","jurusan","prodi","org"]}},{"name":"source","in":"query","description":"Asal input.","schema":{"type":"string","enum":["internal","nlp"]}},{"$ref":"#/components/parameters/search"},{"$ref":"#/components/parameters/sort"},{"$ref":"#/components/parameters/order"}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/Evidence"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/evidence/the-curated":{"get":{"tags":["Bukti Dukung"],"operationId":"listTheCurated","summary":"Bukti pilihan THE Impact Rankings","description":"Irisan bukti terverifikasi yang dikurasi untuk pemeringkatan THE. Punya alamat sendiri karena inilah dataset yang paling sering diminta pihak luar.","parameters":[{"$ref":"#/components/parameters/page"},{"$ref":"#/components/parameters/perPage"},{"$ref":"#/components/parameters/format"},{"$ref":"#/components/parameters/sdg"},{"$ref":"#/components/parameters/year"}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/Evidence"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/evidence/grouped":{"get":{"tags":["Bukti Dukung"],"operationId":"groupedEvidence","summary":"Bukti dikelompokkan per SDG","description":"Selalu mengembalikan 17 kelompok — termasuk SDG yang belum punya bukti (nilai nol), sehingga bentuk jawabannya stabil untuk dashboard.","parameters":[{"$ref":"#/components/parameters/sdg"},{"$ref":"#/components/parameters/facultyCode"},{"$ref":"#/components/parameters/year"},{"name":"limit_per_sdg","in":"query","description":"Jumlah bukti contoh per SDG (0–50).","schema":{"type":"integer","default":10}}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/EvidenceGroup"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/evidence/years":{"get":{"tags":["Bukti Dukung"],"operationId":"evidenceYears","summary":"Tahun yang tersedia","description":"Daftar tahun beserta jumlah bukti — untuk mengisi dropdown filter.","parameters":[],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"type":"object"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/evidence/{id}":{"get":{"tags":["Bukti Dukung"],"operationId":"getEvidence","summary":"Detail bukti dukung","description":"Menyertakan publikasi ilmiah yang tertaut ke bukti ini, bila ada.","parameters":[{"name":"id","in":"path","required":true,"description":"Id bukti.","schema":{"type":"integer"}}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"$ref":"#/components/schemas/Evidence"},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Tidak ditemukan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/news":{"get":{"tags":["Berita & Web"],"operationId":"listNews","summary":"Bukti hasil panen web","description":"Berita dan halaman kampus yang dipanen harvester, lengkap dengan skor relevansi dan kata kunci pemicunya.\n\n**Default `status=published`.** Baris `raw` adalah hasil mentah scraper yang belum ditinjau manusia dan sebagian salah tangkap — tersedia lewat `status=all` bagi yang ingin meneliti pipeline apa adanya.\n\nPengurutan: `published_at`, `scraped_at`, `created_at`, `relevance`, `title`.","parameters":[{"$ref":"#/components/parameters/page"},{"$ref":"#/components/parameters/perPage"},{"$ref":"#/components/parameters/format"},{"$ref":"#/components/parameters/sdg"},{"name":"status","in":"query","description":"Status tinjauan.","schema":{"type":"string","enum":["published","raw","validated","rejected","all"],"default":"published"}},{"name":"domain","in":"query","description":"Domain sumber, mis. `unsri.ac.id`.","schema":{"type":"string"}},{"name":"language","in":"query","description":"Kode bahasa.","schema":{"type":"string"}},{"name":"category","in":"query","description":"Nilai kolom kategori mentah, mis. `SDG-13` atau `berita`.","schema":{"type":"string"}},{"name":"min_relevance","in":"query","description":"Skor relevansi minimum (0–100).","schema":{"type":"integer"}},{"name":"published_from","in":"query","description":"Terbit sejak (YYYY-MM-DD).","schema":{"type":"string","format":"date"}},{"name":"published_to","in":"query","description":"Terbit sampai (YYYY-MM-DD).","schema":{"type":"string","format":"date"}},{"$ref":"#/components/parameters/search"},{"$ref":"#/components/parameters/sort"},{"$ref":"#/components/parameters/order"}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/NewsItem"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/news/sources":{"get":{"tags":["Berita & Web"],"operationId":"listNewsSources","summary":"Domain sumber harvester","description":"Peta cakupan harvester: domain mana yang dipanen, kapan terakhir, dan apakah robots.txt-nya mengizinkan.","parameters":[{"$ref":"#/components/parameters/format"}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/NewsSource"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/news/stats":{"get":{"tags":["Berita & Web"],"operationId":"newsStats","summary":"Statistik berita","description":"Sebaran per status, per domain, dan per bulan selama 24 bulan terakhir.","parameters":[],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Tidak ditemukan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/news/{id}":{"get":{"tags":["Berita & Web"],"operationId":"getNews","summary":"Detail bukti berita","description":"Menyertakan seluruh prediksi NLP untuk baris ini — berguna untuk membandingkan label mesin dengan keputusan peninjau.","parameters":[{"name":"id","in":"path","required":true,"description":"UUID bukti berita.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"$ref":"#/components/schemas/NewsItem"},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Tidak ditemukan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/publications":{"get":{"tags":["Publikasi"],"operationId":"listPublications","summary":"Daftar publikasi ilmiah","description":"Publikasi dosen UNSRI hasil panen OpenAlex dan sumber lain.\n\n**Abstrak tidak disertakan** di endpoint daftar (satu halaman bisa mencapai megabyte). Tambahkan `include=abstract` bila memang diperlukan, atau ambil per publikasi.\n\nPengurutan: `year`, `citations`, `title`, `date`, `created_at`.","parameters":[{"$ref":"#/components/parameters/page"},{"$ref":"#/components/parameters/perPage"},{"$ref":"#/components/parameters/format"},{"$ref":"#/components/parameters/sdg"},{"$ref":"#/components/parameters/year"},{"name":"year_from","in":"query","description":"Tahun terbit mulai.","schema":{"type":"integer"}},{"name":"year_to","in":"query","description":"Tahun terbit sampai.","schema":{"type":"integer"}},{"name":"type","in":"query","description":"Jenis dokumen, mis. `article`, `book-chapter`.","schema":{"type":"string"}},{"name":"category","in":"query","description":"Kategori internal.","schema":{"type":"string","enum":["penelitian","pengabdian","lainnya"]}},{"name":"open_access","in":"query","description":"Hanya yang open access.","schema":{"type":"boolean"}},{"name":"has_doi","in":"query","description":"Hanya yang punya DOI.","schema":{"type":"boolean"}},{"name":"min_citations","in":"query","description":"Sitasi minimum.","schema":{"type":"integer"}},{"name":"author","in":"query","description":"Cari berdasarkan nama penulis.","schema":{"type":"string"}},{"name":"venue","in":"query","description":"Cari berdasarkan nama jurnal/venue.","schema":{"type":"string"}},{"name":"include","in":"query","description":"Sertakan kolom berat. Nilai: `abstract`.","schema":{"type":"string"}},{"$ref":"#/components/parameters/search"},{"$ref":"#/components/parameters/sort"},{"$ref":"#/components/parameters/order"}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/Publication"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/publications/stats":{"get":{"tags":["Publikasi"],"operationId":"publicationStats","summary":"Statistik publikasi","description":"Total, rasio open access, sebaran per tahun/SDG/jenis, venue teratas, dan sepuluh publikasi paling banyak disitasi.","parameters":[],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Tidak ditemukan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/publications/authors":{"get":{"tags":["Publikasi"],"operationId":"listAuthors","summary":"Direktori penulis","description":"Agregasi per nama penulis: jumlah publikasi, sitasi, dan ORCID. Default hanya penulis berafiliasi UNSRI (`unsri_only=false` untuk semua ko-penulis).","parameters":[{"$ref":"#/components/parameters/page"},{"$ref":"#/components/parameters/perPage"},{"$ref":"#/components/parameters/format"},{"name":"unsri_only","in":"query","description":"Batasi ke penulis UNSRI.","schema":{"type":"boolean","default":true}},{"name":"orcid","in":"query","description":"Cari ORCID persis.","schema":{"type":"string"}},{"$ref":"#/components/parameters/search"}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/AuthorSummary"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/publications/{id}":{"get":{"tags":["Publikasi"],"operationId":"getPublication","summary":"Detail publikasi","description":"Lengkap dengan abstrak, seluruh penulis berurutan, pemetaan SDG beserta keyakinannya, dan jejak sumber tiap penyedia data.","parameters":[{"name":"id","in":"path","required":true,"description":"Id publikasi.","schema":{"type":"integer"}}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"$ref":"#/components/schemas/PublicationDetail"},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Tidak ditemukan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/publications/{id}/authors":{"get":{"tags":["Publikasi"],"operationId":"getPublicationAuthors","summary":"Penulis satu publikasi","parameters":[{"name":"id","in":"path","required":true,"description":"Id publikasi.","schema":{"type":"integer"}}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicationAuthor"}},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Tidak ditemukan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/policies":{"get":{"tags":["Kebijakan"],"operationId":"listPolicies","summary":"Daftar kebijakan","description":"Kebijakan universitas beserta pemetaan SDG-nya. Hanya kebijakan aktif; `status=all` menyertakan yang sudah dicabut.","parameters":[{"$ref":"#/components/parameters/page"},{"$ref":"#/components/parameters/perPage"},{"$ref":"#/components/parameters/format"},{"$ref":"#/components/parameters/sdg"},{"name":"status","in":"query","description":"Cakupan status.","schema":{"type":"string","enum":["active","all"],"default":"active"}},{"$ref":"#/components/parameters/search"}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/Policy"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/policies/grouped":{"get":{"tags":["Kebijakan"],"operationId":"groupedPolicies","summary":"Kebijakan dikelompokkan per SDG","description":"Selalu 17 kelompok. Satu kebijakan bisa muncul di beberapa SDG.","responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"type":"object"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/policies/stats":{"get":{"tags":["Kebijakan"],"operationId":"policyStats","summary":"Statistik kebijakan","parameters":[],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Tidak ditemukan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/policies/{id}":{"get":{"tags":["Kebijakan"],"operationId":"getPolicy","summary":"Detail kebijakan","parameters":[{"name":"id","in":"path","required":true,"description":"Id kebijakan.","schema":{"type":"integer"}}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"$ref":"#/components/schemas/Policy"},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Tidak ditemukan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/articles":{"get":{"tags":["Konten"],"operationId":"listArticles","summary":"Artikel microsite","description":"Isi HTML tidak disertakan kecuali `include=content`.\n\nPengurutan: `published_at`, `created_at`, `views`, `title`.","parameters":[{"$ref":"#/components/parameters/page"},{"$ref":"#/components/parameters/perPage"},{"$ref":"#/components/parameters/format"},{"name":"status","in":"query","description":"Status terbit.","schema":{"type":"string","enum":["published","draft","archived","all"],"default":"published"}},{"name":"published_from","in":"query","description":"Terbit sejak.","schema":{"type":"string","format":"date"}},{"name":"published_to","in":"query","description":"Terbit sampai.","schema":{"type":"string","format":"date"}},{"name":"include","in":"query","description":"Nilai: `content`.","schema":{"type":"string"}},{"$ref":"#/components/parameters/search"},{"$ref":"#/components/parameters/sort"},{"$ref":"#/components/parameters/order"}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/Article"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/articles/{idOrSlug}":{"get":{"tags":["Konten"],"operationId":"getArticle","summary":"Detail artikel","description":"Menerima id numerik maupun slug (termasuk slug versi Inggris).","parameters":[{"name":"idOrSlug","in":"path","required":true,"description":"Id atau slug artikel.","schema":{"type":"string"}}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"$ref":"#/components/schemas/Article"},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Tidak ditemukan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/agendas":{"get":{"tags":["Konten"],"operationId":"listAgendas","summary":"Agenda kegiatan","parameters":[{"$ref":"#/components/parameters/page"},{"$ref":"#/components/parameters/perPage"},{"$ref":"#/components/parameters/format"},{"name":"status","in":"query","description":"Status terbit.","schema":{"type":"string","enum":["published","draft","archived","all"],"default":"published"}},{"name":"upcoming","in":"query","description":"Hanya kegiatan yang belum lewat.","schema":{"type":"boolean"}},{"name":"from","in":"query","description":"Kegiatan sejak tanggal.","schema":{"type":"string","format":"date"}},{"name":"to","in":"query","description":"Kegiatan sampai tanggal.","schema":{"type":"string","format":"date"}},{"name":"include","in":"query","description":"Nilai: `content`.","schema":{"type":"string"}},{"$ref":"#/components/parameters/search"}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/Agenda"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/agendas/{idOrSlug}":{"get":{"tags":["Konten"],"operationId":"getAgenda","summary":"Detail agenda","parameters":[{"name":"idOrSlug","in":"path","required":true,"description":"Id atau slug agenda.","schema":{"type":"string"}}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"$ref":"#/components/schemas/Agenda"},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Tidak ditemukan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/annual-reports":{"get":{"tags":["Konten"],"operationId":"listAnnualReports","summary":"Laporan tahunan","parameters":[{"$ref":"#/components/parameters/format"},{"$ref":"#/components/parameters/year"}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/Document"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/handbooks":{"get":{"tags":["Konten"],"operationId":"listHandbooks","summary":"Handbook & panduan","parameters":[{"$ref":"#/components/parameters/format"},{"name":"category","in":"query","description":"Kategori handbook.","schema":{"type":"string"}},{"$ref":"#/components/parameters/year"}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/Document"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/masthead-slides":{"get":{"tags":["Konten"],"operationId":"listMasthead","summary":"Slide masthead microsite","description":"Materi banner beranda, dwibahasa.","parameters":[],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/MastheadSlide"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/why-sdgs":{"get":{"tags":["Konten"],"operationId":"listWhySdgs","summary":"Butir \"Kenapa SDGs\"","parameters":[],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/WhyItem"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/nlp/predictions":{"get":{"tags":["NLP"],"operationId":"listNlpPredictions","summary":"Prediksi klasifikasi SDG","description":"Hasil mesin NLP internal beserta status tinjauan manusianya. Yang ditolak peninjau ikut ditampilkan — justru pasangan prediksi-vs-keputusan itulah yang membuat mutu model bisa dinilai dari luar.","parameters":[{"$ref":"#/components/parameters/page"},{"$ref":"#/components/parameters/perPage"},{"$ref":"#/components/parameters/format"},{"name":"status","in":"query","description":"Status tinjauan.","schema":{"type":"string","enum":["pending_review","approved","rejected","revoked","all"],"default":"all"}},{"$ref":"#/components/parameters/sdg"},{"name":"min_confidence","in":"query","description":"Keyakinan minimum (0–100).","schema":{"type":"integer"}},{"$ref":"#/components/parameters/search"}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/NlpPrediction"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/nlp/stats":{"get":{"tags":["NLP"],"operationId":"nlpStats","summary":"Statistik & akurasi NLP","description":"Tingkat persetujuan peninjau, sebaran keyakinan, dan hasil evaluasi model terakhir.","parameters":[],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Tidak ditemukan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/nlp/evaluations":{"get":{"tags":["NLP"],"operationId":"listNlpEvaluations","summary":"Riwayat evaluasi model","parameters":[],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"type":"object"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/nlp/evaluations/{id}":{"get":{"tags":["NLP"],"operationId":"getNlpEvaluation","summary":"Detail evaluasi model","description":"Tambahkan `include=receipt` untuk log lengkap per artikel uji. Log ini bisa sangat besar — jangan diminta di jalur yang sensitif waktu.","parameters":[{"name":"id","in":"path","required":true,"description":"Id evaluasi.","schema":{"type":"integer"}},{"name":"include","in":"query","description":"Nilai: `receipt`.","schema":{"type":"string"}}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Tidak ditemukan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/monev/frameworks":{"get":{"tags":["Monev"],"operationId":"listFrameworks","summary":"Kerangka indikator","parameters":[],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"type":"object"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/monev/indicators":{"get":{"tags":["Monev"],"operationId":"listIndicators","summary":"Daftar indikator","parameters":[{"$ref":"#/components/parameters/format"},{"name":"framework","in":"query","description":"Kode kerangka.","schema":{"type":"string"}},{"name":"framework_id","in":"query","description":"Id kerangka.","schema":{"type":"integer"}},{"$ref":"#/components/parameters/sdg"},{"name":"measure_level","in":"query","description":"Tingkat pengukuran.","schema":{"type":"string","enum":["university","faculty","jurusan","prodi","org"]}},{"name":"source_type","in":"query","description":"Cara pengisian.","schema":{"type":"string","enum":["manual","auto","hybrid"]}},{"$ref":"#/components/parameters/search"}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/MonevIndicator"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/monev/periods":{"get":{"tags":["Monev"],"operationId":"listPeriods","summary":"Periode pelaporan","parameters":[{"$ref":"#/components/parameters/year"},{"name":"status","in":"query","description":"Status periode.","schema":{"type":"string","enum":["draft","open","closed","locked"]}}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/MonevPeriod"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/monev/achievements":{"get":{"tags":["Monev"],"operationId":"listAchievements","summary":"Capaian indikator","description":"**Default `status=verified`.** Baris draft/submitted adalah angka yang masih diperiksa auditor; menyiarkannya sebagai capaian resmi bisa menghasilkan perbandingan antarfakultas yang keliru. Gunakan `status=all` bila memang ingin melihat prosesnya.\n\nSetiap baris menyertakan target yang berlaku dan rasio capaiannya.","parameters":[{"$ref":"#/components/parameters/page"},{"$ref":"#/components/parameters/perPage"},{"$ref":"#/components/parameters/format"},{"name":"status","in":"query","description":"Status verifikasi.","schema":{"type":"string","enum":["verified","draft","submitted","rejected","all"],"default":"verified"}},{"name":"period_id","in":"query","description":"Id periode.","schema":{"type":"integer"}},{"name":"indicator_id","in":"query","description":"Id indikator.","schema":{"type":"integer"}},{"$ref":"#/components/parameters/facultyCode"},{"name":"faculty_id","in":"query","description":"Id fakultas.","schema":{"type":"integer"}},{"name":"scope_level","in":"query","description":"Tingkat cakupan.","schema":{"type":"string"}},{"$ref":"#/components/parameters/year"}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/MonevAchievement"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/monev/achievements/{id}":{"get":{"tags":["Monev"],"operationId":"getAchievement","summary":"Detail capaian","description":"Termasuk seluruh bukti pendukung yang dilampirkan unit.","parameters":[{"name":"id","in":"path","required":true,"description":"Id capaian.","schema":{"type":"integer"}}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"$ref":"#/components/schemas/MonevAchievement"},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Tidak ditemukan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/monev/targets":{"get":{"tags":["Monev"],"operationId":"listTargets","summary":"Target indikator","parameters":[{"$ref":"#/components/parameters/format"},{"name":"period_id","in":"query","description":"Id periode.","schema":{"type":"integer"}},{"name":"indicator_id","in":"query","description":"Id indikator.","schema":{"type":"integer"}},{"name":"faculty_id","in":"query","description":"Id fakultas.","schema":{"type":"integer"}}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"type":"object"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/monev/evaluations":{"get":{"tags":["Monev"],"operationId":"listEvaluations","summary":"Evaluasi periodik","description":"Ringkasan dan analisis kesenjangan per periode.","parameters":[],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"type":"object"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/monev/recommendations":{"get":{"tags":["Monev"],"operationId":"listRecommendations","summary":"Rekomendasi tindak lanjut","parameters":[{"name":"status","in":"query","description":"Status tindak lanjut.","schema":{"type":"string","enum":["open","in_progress","done","cancelled"]}},{"name":"evaluation_id","in":"query","description":"Id evaluasi.","schema":{"type":"integer"}}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"type":"object"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/monev/reports":{"get":{"tags":["Monev"],"operationId":"listMonevReports","summary":"Berkas laporan monev","description":"Hanya laporan yang sudah dipublikasikan.","parameters":[],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"type":"object"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/monev/summary":{"get":{"tags":["Monev"],"operationId":"monevSummary","summary":"Ringkasan monev","description":"Total per kerangka, rata-rata capaian per indikator, dan analisis kesenjangan terhadap target.","parameters":[{"$ref":"#/components/parameters/year"}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Tidak ditemukan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/contributors":{"get":{"tags":["Kontributor"],"operationId":"listContributors","summary":"Direktori kontributor","description":"Profil publik pengelola dan kontributor SDGs UNSRI.\n\n**Email, NIP, dan data kepegawaian tidak disertakan** — endpoint ini memakai daftar putih kolom, bukan menyalin isi tabel pengguna.","parameters":[{"$ref":"#/components/parameters/page"},{"$ref":"#/components/parameters/perPage"},{"$ref":"#/components/parameters/format"},{"name":"role","in":"query","description":"Peran sistem.","schema":{"type":"string"}},{"$ref":"#/components/parameters/facultyCode"},{"name":"faculty_id","in":"query","description":"Id fakultas.","schema":{"type":"integer"}},{"name":"position_type","in":"query","description":"Jenis posisi.","schema":{"type":"string","enum":["dosen","staf","peneliti","mahasiswa","lainnya"]}},{"$ref":"#/components/parameters/search"}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/Contributor"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/contributors/{id}":{"get":{"tags":["Kontributor"],"operationId":"getContributor","summary":"Detail kontributor","description":"Termasuk sebaran SDG dan bukti terbaru yang ia ajukan.","parameters":[{"name":"id","in":"path","required":true,"description":"Id kontributor.","schema":{"type":"integer"}}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"$ref":"#/components/schemas/Contributor"},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Tidak ditemukan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/researcher-ids":{"get":{"tags":["Kontributor"],"operationId":"listResearcherIds","summary":"Pengenal riset eksternal","description":"ORCID, Scopus, SINTA, NIDN, OpenAlex, dan WoS milik dosen — kunci untuk menautkan data ini dengan pangkalan data bibliometrik pihak lain.","parameters":[{"$ref":"#/components/parameters/format"},{"name":"scheme","in":"query","description":"Skema pengenal.","schema":{"type":"string","enum":["orcid","scopus","sinta","nidn","openalex","wos"]}}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"type":"object"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/dashboard/overview":{"get":{"tags":["Dashboard"],"operationId":"dashboardOverview","summary":"Angka ringkas seluruh sistem","description":"Semua penghitung utama dalam satu panggilan: bukti, publikasi, berita, kebijakan, organisasi, konten, monev.","parameters":[],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"$ref":"#/components/schemas/DashboardOverview"},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Tidak ditemukan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/dashboard/sdg-breakdown":{"get":{"tags":["Dashboard"],"operationId":"dashboardSdgBreakdown","summary":"Sebaran seluruh data per SDG","description":"Satu baris per tujuan (selalu 17), menggabungkan bukti, publikasi, kebijakan, prediksi NLP, dan berita.","parameters":[],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/SdgBreakdownRow"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/dashboard/faculty-performance":{"get":{"tags":["Dashboard"],"operationId":"dashboardFaculty","summary":"Kinerja per fakultas","description":"Jumlah bukti, tingkat verifikasi, dan cakupan SDG tiap fakultas.","parameters":[],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/FacultyPerformanceRow"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/dashboard/trend":{"get":{"tags":["Dashboard"],"operationId":"dashboardTrend","summary":"Tren bulanan","description":"Bukti, publikasi, dan berita pada satu sumbu waktu. Bulan tanpa data tetap hadir bernilai nol supaya bentuk grafik tidak menyesatkan.","parameters":[{"name":"months","in":"query","description":"Panjang jendela, 1–60 bulan.","schema":{"type":"integer","default":12}}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/TrendPoint"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/dashboard/publications":{"get":{"tags":["Dashboard"],"operationId":"dashboardPublications","summary":"Ringkasan publikasi","parameters":[],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Tidak ditemukan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/dashboard/recent":{"get":{"tags":["Dashboard"],"operationId":"dashboardRecent","summary":"Aktivitas terbaru","description":"Bukti, publikasi, berita, dan artikel terbaru — bahan untuk panel \"terkini\".","parameters":[{"name":"limit","in":"query","description":"Jumlah per jenis, 1–50.","schema":{"type":"integer","default":10}}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Tidak ditemukan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/dashboard/full":{"get":{"tags":["Dashboard"],"operationId":"dashboardFull","summary":"Seluruh dashboard dalam satu panggilan","description":"Menggabungkan overview, sebaran SDG, kinerja fakultas, tren, ringkasan publikasi, dan aktivitas terbaru. Dirancang agar dashboard pihak ketiga cukup memanggil satu endpoint, bukan tujuh.","parameters":[{"name":"months","in":"query","description":"Panjang jendela tren.","schema":{"type":"integer","default":12}},{"name":"limit","in":"query","description":"Jumlah item \"terbaru\" per jenis.","schema":{"type":"integer","default":10}}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Tidak ditemukan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/stats/summary":{"get":{"tags":["Dashboard"],"operationId":"statsSummary","summary":"Kartu angka besar","description":"Enam angka untuk halaman depan. Di-cache 5 menit.","parameters":[],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Tidak ditemukan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/ops/pipeline-status":{"get":{"tags":["Operasional"],"operationId":"pipelineStatus","summary":"Kesehatan pipeline data","description":"Kapan panen dan scraping terakhir berhasil, dan kapan data terbaru masuk. **Periksa ini sebelum menyimpulkan tren dari data tahun berjalan** — angka yang terlihat rendah sering berarti panen terakhir sudah lama, bukan produktivitas yang turun.","parameters":[],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Tidak ditemukan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/ops/harvest-runs":{"get":{"tags":["Operasional"],"operationId":"listHarvestRuns","summary":"Riwayat panen publikasi","parameters":[{"$ref":"#/components/parameters/page"},{"$ref":"#/components/parameters/perPage"},{"$ref":"#/components/parameters/format"},{"name":"source","in":"query","description":"Sumber, mis. `openalex`.","schema":{"type":"string"}},{"name":"status","in":"query","description":"Status jalan.","schema":{"type":"string","enum":["running","success","partial","failed"]}}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"type":"object"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/ops/scrape-jobs":{"get":{"tags":["Operasional"],"operationId":"listScrapeJobs","summary":"Riwayat pekerjaan scraper","parameters":[{"$ref":"#/components/parameters/page"},{"$ref":"#/components/parameters/perPage"},{"$ref":"#/components/parameters/format"},{"name":"status","in":"query","description":"Status pekerjaan.","schema":{"type":"string","enum":["queued","running","completed","failed"]}},{"name":"domain_id","in":"query","description":"Id domain.","schema":{"type":"integer"}}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"type":"object"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/ops/scrape-feeds":{"get":{"tags":["Operasional"],"operationId":"listScrapeFeeds","summary":"Feed RSS/sitemap terpantau","parameters":[{"$ref":"#/components/parameters/format"}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"type":"object"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/ops/api-usage":{"get":{"tags":["Operasional"],"operationId":"apiUsage","summary":"Statistik pemakaian API","description":"Teragregasi — tanpa alamat IP dan tanpa identitas token. Angka lalu lintas boleh transparan; siapa memanggil apa tidak.","parameters":[{"name":"days","in":"query","description":"Jendela hari, 1–90.","schema":{"type":"integer","default":30}}],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Tidak ditemukan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/ops/activity-summary":{"get":{"tags":["Operasional"],"operationId":"activitySummary","summary":"Ringkasan aktivitas sistem","description":"Sebaran aksi dan entitas. IP dan user-agent sengaja tidak disertakan — keduanya melacak orang, bukan menjelaskan data.","parameters":[],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Tidak ditemukan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Kuota terlampaui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Kesalahan server","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/tokens":{"post":{"tags":["Token"],"operationId":"issueToken","summary":"Terbitkan token API","description":"Penerbitan mandiri, tanpa perlu akun dan tanpa persetujuan manual.\n\n**Token hanya ditampilkan sekali.** Yang tersimpan di server hanya sidik SHA-256-nya — admin sekalipun tidak bisa memunculkannya kembali. Hilang berarti terbitkan ulang, bukan pulihkan.\n\nBatas penerbitan: 5 token per IP dan 3 per email dalam 24 jam.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenIssueRequest"}}}},"responses":{"201":{"description":"Token berhasil diterbitkan","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"$ref":"#/components/schemas/TokenIssued"},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"400":{"description":"Parameter tidak valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Penerbitan mandiri dinonaktifkan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Batas penerbitan tercapai","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/tokens/me":{"get":{"tags":["Token"],"operationId":"tokenInfo","summary":"Info & pemakaian token sendiri","description":"Kuota terpakai hari ini, sisa jatah, dan riwayat harian 30 hari terakhir.","responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"$ref":"#/components/schemas/TokenInfo"},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/tokens/rotate":{"post":{"tags":["Token"],"operationId":"rotateToken","summary":"Ganti token (rotasi)","description":"Untuk token yang diduga bocor. Token lama dicabut saat itu juga; token baru mewarisi nama, scope, dan kuotanya.","responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"$ref":"#/components/schemas/TokenIssued"},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/tokens/revoke":{"post":{"tags":["Token"],"operationId":"revokeToken","summary":"Cabut token sendiri","description":"Tidak bisa dibatalkan. Token yang sudah dicabut tidak dapat diaktifkan kembali.","responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}},"401":{"description":"Token dikirim tapi tidak berlaku","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/tokens/scopes":{"get":{"tags":["Token"],"operationId":"listScopes","summary":"Daftar scope","security":[],"responses":{"200":{"description":"Berhasil","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"type":"object"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"filters":{"type":"object","additionalProperties":true,"description":"Filter yang benar-benar diterapkan server."},"meta":{"type":"object","additionalProperties":true}},"required":["success","data"]}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Cara yang disarankan: `Authorization: Bearer sdg_live_…`. Opsional — tanpa token pun endpoint tetap menjawab, dengan kuota anonim."},"apiKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Alternatif untuk klien yang lebih mudah menyetel header khusus."},"apiKeyQuery":{"type":"apiKey","in":"query","name":"api_key","description":"Jalan terakhir untuk spreadsheet dan browser yang tidak bisa mengirim header. Hindari di lingkungan produksi — query string mudah tercatat di log proxy."}},"parameters":{"page":{"name":"page","in":"query","description":"Halaman ke berapa (mulai dari 1).","schema":{"type":"integer","minimum":1,"default":1}},"perPage":{"name":"per_page","in":"query","description":"Baris per halaman. Maksimum 200.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},"format":{"name":"format","in":"query","description":"Setel ke `csv` untuk mengunduh hasil sebagai berkas CSV (UTF-8 dengan BOM, siap dibuka di Excel).","schema":{"type":"string","enum":["json","csv"],"default":"json"}},"search":{"name":"search","in":"query","description":"Pencarian teks bebas pada kolom judul/deskripsi.","schema":{"type":"string"}},"sdg":{"name":"sdg","in":"query","description":"Saring per nomor SDG (1–17). Bisa banyak, dipisah koma: `sdg=3,4,5`.","schema":{"type":"string","example":"4"}},"year":{"name":"year","in":"query","description":"Saring per tahun.","schema":{"type":"integer"}},"facultyCode":{"name":"faculty","in":"query","description":"Kode fakultas, mis. `FASILKOM`.","schema":{"type":"string"}},"sort":{"name":"sort","in":"query","description":"Kolom pengurutan (lihat daftar di deskripsi endpoint).","schema":{"type":"string"}},"order":{"name":"order","in":"query","description":"Arah pengurutan.","schema":{"type":"string","enum":["asc","desc"],"default":"desc"}}},"schemas":{"Pagination":{"type":"object","description":"Blok paginasi yang menyertai setiap endpoint daftar.","properties":{"page":{"type":"integer","example":1},"per_page":{"type":"integer","example":50},"total":{"type":"integer","example":5408},"total_pages":{"type":"integer","example":109},"has_next":{"type":"boolean"},"has_prev":{"type":"boolean"}}},"Error":{"type":"object","properties":{"success":{"type":"boolean","const":false},"error":{"type":"object","properties":{"code":{"type":"string","example":"rate_limited","description":"Kode mesin — stabil, aman dipakai untuk percabangan kode."},"message":{"type":"string","example":"Batas 60 request/menit terlampaui."},"hint":{"type":"string","nullable":true}},"required":["code","message"]}}},"SdgRef":{"type":"object","nullable":true,"properties":{"number":{"type":"integer","minimum":1,"maximum":17,"example":4},"name":{"type":"string","example":"Quality Education"},"name_id":{"type":"string","example":"Pendidikan Berkualitas"},"color":{"type":"string","example":"#C5192D"},"icon_url":{"type":"string","example":"/images/sdg-icons/E_WEB_04.png"}}},"Sdg":{"type":"object","properties":{"id":{"type":"integer"},"number":{"type":"integer","minimum":1,"maximum":17},"name":{"type":"string"},"name_id":{"type":"string"},"color":{"type":"string"},"icon":{"type":"string","nullable":true},"icon_url":{"type":"string"},"is_active":{"type":"boolean"},"counts":{"type":"object","properties":{"subcategories":{"type":"integer"},"evidence":{"type":"integer"},"publications":{"type":"integer"},"policies":{"type":"integer"}}}}},"SdgDetail":{"allOf":[{"$ref":"#/components/schemas/Sdg"},{"type":"object","properties":{"subcategories":{"type":"array","items":{"$ref":"#/components/schemas/SdgSubcategory"}},"keywords":{"type":"array","items":{"type":"object","properties":{"keyword":{"type":"string"},"language":{"type":"string","example":"id"},"weight":{"type":"number"}}}}}}]},"SdgSubcategory":{"type":"object","properties":{"id":{"type":"integer"},"code":{"type":"string","example":"4.3"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"is_active":{"type":"boolean"},"sdg":{"$ref":"#/components/schemas/SdgRef"}}},"SdgKeyword":{"type":"object","properties":{"id":{"type":"integer"},"sdg_number":{"type":"integer"},"keyword":{"type":"string"},"language":{"type":"string"},"weight":{"type":"number"},"is_active":{"type":"boolean"}}},"Faculty":{"type":"object","properties":{"id":{"type":"integer"},"code":{"type":"string","example":"FASILKOM"},"name":{"type":"string","example":"Fakultas Ilmu Komputer"},"is_active":{"type":"boolean"},"counts":{"type":"object","properties":{"jurusan":{"type":"integer"},"prodi":{"type":"integer"},"verified_evidence":{"type":"integer"},"sdgs_covered":{"type":"integer"}}}}},"FacultyDetail":{"type":"object","properties":{"id":{"type":"integer"},"code":{"type":"string"},"name":{"type":"string"},"is_active":{"type":"boolean"},"jurusan":{"type":"array","items":{"$ref":"#/components/schemas/Jurusan"}},"prodi":{"type":"array","items":{"$ref":"#/components/schemas/Prodi"}},"sdg_breakdown":{"type":"array","items":{"type":"object","properties":{"number":{"type":"integer"},"name":{"type":"string"},"evidence_count":{"type":"integer"}}}}}},"Jurusan":{"type":"object","properties":{"id":{"type":"integer"},"code":{"type":"string","nullable":true},"name":{"type":"string"},"is_active":{"type":"boolean"},"faculty":{"type":"object","nullable":true,"properties":{"id":{"type":"integer"},"code":{"type":"string"},"name":{"type":"string"}}},"prodi_count":{"type":"integer"}}},"Prodi":{"type":"object","properties":{"id":{"type":"integer"},"code":{"type":"string","nullable":true},"name":{"type":"string"},"degree_level":{"type":"string","enum":["D3","D4","S1","S2","S3","Profesi"],"nullable":true},"is_active":{"type":"boolean"},"faculty":{"type":"object","nullable":true},"jurusan":{"type":"object","nullable":true}}},"OrgUnit":{"type":"object","properties":{"id":{"type":"integer"},"type":{"type":"string","enum":["bem","hima","dema","ukm","other"]},"name":{"type":"string"},"is_active":{"type":"boolean"},"faculty":{"type":"object","nullable":true},"prodi":{"type":"object","nullable":true}}},"Evidence":{"type":"object","description":"Bukti dukung SDG yang diinput dan diverifikasi internal universitas.","properties":{"id":{"type":"integer"},"title":{"type":"string"},"title_en":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"description_en":{"type":"string","nullable":true},"evidence_url":{"type":"string","nullable":true,"description":"Tautan sumber eksternal."},"evidence_file_url":{"type":"string","nullable":true,"description":"Berkas terunggah, relatif terhadap host API."},"year":{"type":"integer","nullable":true},"status":{"type":"string","enum":["draft","submitted","verified","rejected"]},"source":{"type":"string","enum":["internal","nlp"],"nullable":true},"owner_level":{"type":"string","enum":["university","faculty","jurusan","prodi","org"],"nullable":true},"is_the_curated":{"type":"boolean","description":"Dipilih untuk berkas THE Impact Rankings."},"the_curated_at":{"type":"string","format":"date-time","nullable":true},"sdg":{"$ref":"#/components/schemas/SdgRef"},"subcategory":{"type":"object","nullable":true,"properties":{"code":{"type":"string"},"name":{"type":"string"}}},"faculty":{"type":"object","nullable":true},"jurusan":{"type":"object","nullable":true},"prodi":{"type":"object","nullable":true},"org_unit":{"type":"object","nullable":true},"submitted_by":{"type":"string","nullable":true},"verified_by":{"type":"string","nullable":true},"verified_at":{"type":"string","format":"date-time","nullable":true},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}},"EvidenceGroup":{"type":"object","properties":{"sdg":{"$ref":"#/components/schemas/SdgRef"},"evidence_count":{"type":"integer"},"the_curated_count":{"type":"integer"},"evidence":{"type":"array","items":{"$ref":"#/components/schemas/Evidence"}}}},"NewsItem":{"type":"object","description":"Bukti hasil panen web (berita, halaman kampus) oleh harvester.","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"url":{"type":"string"},"description":{"type":"string","nullable":true},"category":{"type":"string","nullable":true,"example":"SDG-13"},"subcategory":{"type":"string","nullable":true},"sdg_numbers":{"type":"array","items":{"type":"integer"},"description":"Diseragamkan dari kolom category dan JSON sdg_goals."},"source_domain":{"type":"string","nullable":true},"media":{"type":"object","properties":{"image_url":{"type":"string","nullable":true},"video_url":{"type":"string","nullable":true},"document_url":{"type":"string","nullable":true}}},"keywords_matched":{"description":"Kata kunci pemicu, bentuknya mengikuti versi harvester saat baris dibuat.","nullable":true},"relevance_score":{"type":"number","nullable":true,"description":"Skor 0–100 dari mesin relevansi internal."},"language":{"type":"string","nullable":true},"status":{"type":"string","enum":["raw","validated","published","rejected"]},"published_at":{"type":"string","format":"date-time","nullable":true},"scraped_at":{"type":"string","format":"date-time","nullable":true},"created_at":{"type":"string","format":"date-time"}}},"NewsSource":{"type":"object","properties":{"id":{"type":"integer"},"domain":{"type":"string"},"name":{"type":"string","nullable":true},"base_url":{"type":"string","nullable":true},"is_active":{"type":"boolean"},"is_blocked":{"type":"boolean"},"robots_allowed":{"type":"boolean","nullable":true},"crawl_delay_sec":{"type":"integer","nullable":true},"last_scraped_at":{"type":"string","format":"date-time","nullable":true},"counts":{"type":"object","properties":{"evidence":{"type":"integer"},"published":{"type":"integer"},"feeds":{"type":"integer"}}}}},"Publication":{"type":"object","properties":{"id":{"type":"integer"},"doi":{"type":"string","nullable":true},"doi_url":{"type":"string","nullable":true},"title":{"type":"string"},"abstract":{"type":"string","nullable":true,"description":"Hanya muncul bila ?include=abstract atau pada endpoint detail."},"pub_year":{"type":"integer","nullable":true},"pub_date":{"type":"string","format":"date","nullable":true},"type":{"type":"string","nullable":true,"example":"article"},"venue":{"type":"string","nullable":true},"category":{"type":"string","enum":["penelitian","pengabdian","lainnya"],"nullable":true},"is_open_access":{"type":"boolean","nullable":true},"oa_url":{"type":"string","nullable":true},"citation_count":{"type":"integer","nullable":true},"author_count":{"type":"integer"},"unsri_author_count":{"type":"integer"},"sdg_numbers":{"type":"array","items":{"type":"integer"}},"created_at":{"type":"string","format":"date-time"}}},"PublicationDetail":{"allOf":[{"$ref":"#/components/schemas/Publication"},{"type":"object","properties":{"authors":{"type":"array","items":{"$ref":"#/components/schemas/PublicationAuthor"}},"sdg_mappings":{"type":"array","items":{"type":"object","properties":{"number":{"type":"integer"},"name":{"type":"string"},"confidence":{"type":"number","description":"Keyakinan 0–100."},"source":{"type":"string","enum":["scopus","openalex","internal_nlp"]}}}},"sources":{"type":"array","items":{"type":"object","properties":{"source":{"type":"string","example":"openalex"},"source_id":{"type":"string"},"fetched_at":{"type":"string","format":"date-time"}}}},"linked_evidence":{"type":"array","items":{"type":"object"}}}}]},"PublicationAuthor":{"type":"object","properties":{"name":{"type":"string"},"orcid":{"type":"string","nullable":true},"affiliation":{"type":"string","nullable":true},"is_unsri":{"type":"boolean"},"position":{"type":"integer","nullable":true},"match_status":{"type":"string","enum":["matched","ambiguous","unmatched"],"nullable":true},"match_score":{"type":"number","nullable":true}}},"AuthorSummary":{"type":"object","properties":{"name":{"type":"string"},"orcid":{"type":"string","nullable":true},"orcid_url":{"type":"string","nullable":true},"affiliation":{"type":"string","nullable":true},"is_unsri":{"type":"boolean"},"publication_count":{"type":"integer"},"first_author_count":{"type":"integer"},"citation_count":{"type":"integer"}}},"Policy":{"type":"object","properties":{"id":{"type":"integer"},"title":{"type":"string"},"description":{"type":"string","nullable":true},"pdf_url":{"type":"string","nullable":true},"is_active":{"type":"boolean"},"sdg_numbers":{"type":"array","items":{"type":"integer"}},"sdgs":{"type":"array","items":{"$ref":"#/components/schemas/SdgRef"}},"created_by":{"type":"string","nullable":true},"created_at":{"type":"string","format":"date-time"}}},"Article":{"type":"object","properties":{"id":{"type":"integer"},"title":{"type":"string"},"title_en":{"type":"string","nullable":true},"slug":{"type":"string"},"slug_en":{"type":"string","nullable":true},"excerpt":{"type":"string","nullable":true},"excerpt_en":{"type":"string","nullable":true},"content":{"type":"string","nullable":true,"description":"HTML. Hanya muncul bila ?include=content atau pada endpoint detail."},"image_url":{"type":"string","nullable":true},"author":{"type":"string","nullable":true},"published_at":{"type":"string","format":"date-time","nullable":true},"status":{"type":"string","enum":["draft","published","archived"]},"view_count":{"type":"integer"},"web_url":{"type":"string"}}},"Agenda":{"type":"object","properties":{"id":{"type":"integer"},"title":{"type":"string"},"slug":{"type":"string"},"excerpt":{"type":"string","nullable":true},"content":{"type":"string","nullable":true},"image_url":{"type":"string","nullable":true},"location":{"type":"string","nullable":true},"event_date":{"type":"string","format":"date-time","nullable":true},"event_end_date":{"type":"string","format":"date-time","nullable":true},"status":{"type":"string","enum":["draft","published","archived"]},"web_url":{"type":"string"}}},"Document":{"type":"object","description":"Laporan tahunan atau handbook.","properties":{"id":{"type":"integer"},"title":{"type":"string"},"description":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"year":{"type":"integer","nullable":true},"file_url":{"type":"string","nullable":true},"file_name":{"type":"string","nullable":true},"is_active":{"type":"boolean"}}},"MastheadSlide":{"type":"object","properties":{"id":{"type":"integer"},"title":{"type":"object","properties":{"en":{"type":"string"},"id":{"type":"string"}}},"subtitle":{"type":"object","properties":{"en":{"type":"string"},"id":{"type":"string"}}},"cta":{"type":"object","properties":{"text_en":{"type":"string"},"text_id":{"type":"string"},"url":{"type":"string"}}},"images":{"type":"object","properties":{"background":{"type":"string","nullable":true},"logo_left":{"type":"string","nullable":true},"logo_right":{"type":"string","nullable":true}}},"sort_order":{"type":"integer"}}},"WhyItem":{"type":"object","properties":{"id":{"type":"integer"},"number_label":{"type":"string"},"icon":{"type":"string","nullable":true},"title":{"type":"string"},"description":{"type":"string","nullable":true},"accent_color":{"type":"string","nullable":true},"sort_order":{"type":"integer"}}},"NlpPrediction":{"type":"object","properties":{"id":{"type":"integer"},"evidence_id":{"type":"string","format":"uuid","description":"Merujuk ke /news/{id}."},"title":{"type":"string"},"description":{"type":"string","nullable":true},"predicted_sdg":{"$ref":"#/components/schemas/SdgRef"},"predicted_subcategory":{"type":"object","nullable":true},"predicted_sdg_multi":{"nullable":true,"description":"Prediksi multi-label bila model versi baru yang dipakai."},"confidence_score":{"type":"number","nullable":true},"review_status":{"type":"string","enum":["pending_review","approved","rejected","revoked"]},"source":{"type":"object","properties":{"url":{"type":"string","nullable":true},"domain":{"type":"string","nullable":true}}},"created_at":{"type":"string","format":"date-time"}}},"MonevIndicator":{"type":"object","properties":{"id":{"type":"integer"},"code":{"type":"string"},"name":{"type":"string"},"name_en":{"type":"string","nullable":true},"definition":{"type":"string","nullable":true},"unit_label":{"type":"string","nullable":true},"value_type":{"type":"string","enum":["count","percent","ratio","boolean","currency"]},"direction":{"type":"string","enum":["higher_better","lower_better"]},"measure_level":{"type":"string","enum":["university","faculty","jurusan","prodi","org"]},"source_type":{"type":"string","enum":["manual","auto","hybrid"]},"is_active":{"type":"boolean"},"framework":{"type":"object","nullable":true},"sdg_numbers":{"type":"array","items":{"type":"integer"}}}},"MonevAchievement":{"type":"object","properties":{"id":{"type":"integer"},"value":{"type":"number","nullable":true},"value_source":{"type":"string","enum":["manual","auto","hybrid"]},"target_value":{"type":"number","nullable":true},"achievement_ratio":{"type":"number","nullable":true,"description":"value / target_value. null bila target belum ditetapkan."},"status":{"type":"string","enum":["draft","submitted","verified","rejected"]},"scope":{"type":"object"},"indicator":{"type":"object"},"period":{"type":"object"},"narrative":{"type":"string","nullable":true},"evidence_count":{"type":"integer"}}},"MonevPeriod":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"report_year":{"type":"integer"},"period_type":{"type":"string","enum":["annual","semester","quarter","custom"]},"data_range":{"type":"object","properties":{"start":{"type":"string","format":"date","nullable":true},"end":{"type":"string","format":"date","nullable":true}}},"status":{"type":"string","enum":["draft","open","closed","locked"]},"framework":{"type":"object","nullable":true}}},"Contributor":{"type":"object","description":"Profil publik kontributor. Email, NIP, dan data kepegawaian TIDAK disertakan.","properties":{"id":{"type":"integer"},"full_name":{"type":"string"},"photo_url":{"type":"string","nullable":true},"role":{"type":"string"},"role_label":{"type":"string"},"position_type":{"type":"string","nullable":true},"position_title":{"type":"string","nullable":true},"department":{"type":"string","nullable":true},"faculty":{"type":"object","nullable":true},"external_ids":{"type":"array","items":{"type":"object","properties":{"scheme":{"type":"string","enum":["orcid","scopus","sinta","nidn","openalex","wos"]},"id":{"type":"string"}}}},"contributions":{"type":"object","properties":{"verified_evidence":{"type":"integer"},"publications":{"type":"integer"}}}}},"DashboardOverview":{"type":"object","properties":{"evidence":{"type":"object","properties":{"total":{"type":"integer"},"verified":{"type":"integer"},"pending":{"type":"integer"},"the_curated":{"type":"integer"},"sdgs_covered":{"type":"integer"},"sdg_coverage_ratio":{"type":"number"}}},"publications":{"type":"object","properties":{"total":{"type":"integer"},"open_access":{"type":"integer"},"total_citations":{"type":"integer"},"unsri_authors":{"type":"integer"}}},"news":{"type":"object"},"policies":{"type":"object"},"organization":{"type":"object"},"content":{"type":"object"},"monev":{"type":"object"}}},"SdgBreakdownRow":{"type":"object","properties":{"number":{"type":"integer"},"name":{"type":"string"},"name_id":{"type":"string"},"color":{"type":"string"},"icon_url":{"type":"string"},"evidence":{"type":"integer"},"the_curated":{"type":"integer"},"publications":{"type":"integer"},"policies":{"type":"integer"},"nlp_predictions":{"type":"integer"},"news":{"type":"integer"},"total":{"type":"integer"}}},"FacultyPerformanceRow":{"type":"object","properties":{"id":{"type":"integer"},"code":{"type":"string"},"name":{"type":"string"},"total_evidence":{"type":"integer"},"verified":{"type":"integer"},"pending":{"type":"integer"},"the_curated":{"type":"integer"},"sdgs_covered":{"type":"integer"},"sdg_coverage_ratio":{"type":"number"},"verification_rate":{"type":"number","nullable":true}}},"TrendPoint":{"type":"object","properties":{"month":{"type":"string","example":"2026-08"},"evidence":{"type":"integer"},"evidence_verified":{"type":"integer"},"publications":{"type":"integer"},"news":{"type":"integer"}}},"TokenIssueRequest":{"type":"object","required":["name","email"],"properties":{"name":{"type":"string","minLength":3,"description":"Nama aplikasi/proyek yang akan memakai token.","example":"Dashboard SDGs Fakultas Teknik"},"email":{"type":"string","format":"email","description":"Email penanggung jawab — dipakai bila token perlu dihubungi/dicabut."},"organization":{"type":"string","nullable":true,"example":"Universitas Sriwijaya"},"purpose":{"type":"string","nullable":true,"description":"Untuk apa data ini dipakai."},"scopes":{"type":"array","items":{"type":"string","enum":["read","stats","ops"]},"description":"Default: read + stats."}}},"TokenIssued":{"type":"object","properties":{"token":{"type":"string","description":"HANYA DITAMPILKAN SEKALI. Tidak bisa dibaca ulang.","example":"sdg_live_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"},"id":{"type":"integer"},"name":{"type":"string"},"token_prefix":{"type":"string","example":"sdg_live_a1b2c3d4"},"scopes":{"type":"array","items":{"type":"string"}},"status":{"type":"string","enum":["active","suspended","revoked"]},"limits":{"type":"object","properties":{"per_minute":{"type":"integer"},"per_day":{"type":"integer"}}},"expires_at":{"type":"string","format":"date-time","nullable":true}}},"TokenInfo":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"token_prefix":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"status":{"type":"string"},"limits":{"type":"object"},"usage":{"type":"object","properties":{"today":{"type":"integer"},"total":{"type":"integer"},"remaining_today":{"type":"integer"},"daily_history":{"type":"array","items":{"type":"object"}}}}}},"Dataset":{"type":"object","properties":{"key":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"endpoint":{"type":"string"},"row_count":{"type":"integer","nullable":true},"formats":{"type":"array","items":{"type":"string"}},"tables":{"type":"array","items":{"type":"string"}}}}}}}