A TypeScript library for accessing the PDDikti API, providing a clean, typed, and developer-friendly interface.
This library makes it easier to retrieve data from the Indonesian Higher Education Database (PDDikti) via public endpoints available at https://pddikti.kemdiktisaintek.go.id.
⚠️ CAUTION:This is not an official library of Kemdikbud/DITJEN DIKTIRISTEK.
It serves solely as a convenience wrapper for interacting with publicly accessible PDDikti endpoints.This includes, but is not limited to:
• Data leakage or exposure of personal information
• Security breaches or unauthorized access
• Violations of applicable laws, regulations, or institutional policies
• Legal disputes or claims brought by third parties
• Operational failures, inaccuracies, or corruption of data
• Any damages, losses, liabilities, or penalties incurred by the userThe user assumes full and exclusive responsibility for all actions, decisions, and outcomes associated with the use of this library.
By using this library, the user agrees that the developer shall not be held responsible or liable under any circumstances, regardless of the cause or jurisdiction.Use at your own risk. For educational purposes only.
- 🔍 Query universities, study programs, students, lecturers, and academic activity data.
- 📦 Fully typed with TypeScript.
- 🚀 Works in Node.js (browser support depends on CORS).
- 🧩 Modular and extendable API wrapper.
Installing with npm:
npm install @x403/pddiktiInstalling with Yarn:
yarn add @x403/pddiktiInstalling with pnpm:
pnpm add @x403/pddiktiInstalling with bun:
bun add @x403/pddiktiimport { PDDikti } from "@x403/pddikti"; // or: import PDDikti from "@x403/pddikti";
const pddikti = new PDDikti();const { PDDikti } = require("@x403/pddikti"); // or: const PDDikti = require('@x403/pddikti').default;
const pddikti = new PDDikti();import PDDikti from "@x403/pddikti";
const pddikti = new PDDikti({
// logLevel: "VERBOSE",
cacheEnabled: true,
cachePath: ".pddikti.cache",
});
const students = await pddikti.search.students({
name: "Mulyono",
program: "Kehutanan",
});
for (const student of students) {
console.log(`Name:`, student.name);
console.log(`Nim:`, student.nim);
const detail = await student.detail();
console.log(`Gender:`, detail?.gender);
console.log(`Academic status:`, detail?.status);
console.log(`Education level:`, detail?.educationLevel);
const programStudy = await detail?.program();
console.log(`Program study:`, programStudy?.programName);
console.log(`Accreditation:`, programStudy?.accreditation);
console.log(`Field of study:`, programStudy?.fieldOfStudy);
const campus = await programStudy?.campus();
console.log(`Campus name:`, campus?.name);
console.log(`Campus code:`, campus?.code, "\n");
console.log("-".repeat(64), "\n");
}import PDDikti from "@x403/pddikti";
const pddikti = new PDDikti({
// logLevel: "VERBOSE",
cacheEnabled: true,
cachePath: ".pddikti.cache",
});
const lecturers = await pddikti.search.lecturers({
name: "Mulyono",
program: "Kehutanan",
});
for (const lecturer of lecturers) {
console.log(`Name:`, lecturer.name);
console.log(`Nidn:`, lecturer.nidn);
console.log(`Nuptk:`, lecturer.nuptk);
// Wrapper of: detail, study history, teaching history, research, dedication, invention and patent
const profile = await lecturer.detail();
console.log(`Gender:`, profile?.gender);
console.log(`Status:`, profile?.status);
console.log(`Position:`, profile?.position);
console.log(`Position Status:`, profile?.positionStatus);
console.log(`Study history count:`, profile?.study?.length);
console.log(`Teaching history count:`, profile?.teaching?.length);
console.log(`Research count:`, profile?.research?.length);
console.log(`Dedication count:`, profile?.dedication?.length);
console.log(`Patent count:`, profile?.patent?.length);
console.log(
`Title:`,
profile?.study.map((s): string => s.degreeAbbreviation).join(", ")
);
console.log(`Campus name:`, profile?.campusName);
console.log(`Campus short name:`, profile?.campusShortName, "\n");
console.log("-".repeat(64), "\n");
}import PDDikti from "@x403/pddikti";
const pddikti = new PDDikti({
// logLevel: "VERBOSE",
cacheEnabled: true,
cachePath: ".pddikti.cache",
});
const searches = await pddikti.search.all(`UNI`);
type ResultKey = "students" | "lecturers" | "programs" | "campuses";
for (const key of Object.keys(searches)) {
const searchResults = searches[key as ResultKey];
console.log("\n", "=".repeat(32), key.toUpperCase(), "=".repeat(32), "\n");
for (const result of searchResults) {
console.log(`${key} name:`, result.name);
}
}import PDDikti from "@x403/pddikti";
const pddikti = new PDDikti({
// logLevel: "VERBOSE",
cacheEnabled: true,
cachePath: ".pddikti.cache",
});
// Search for student and get single result
const studentRes = await pddikti.search.student({
name: "Mulyono",
});
console.log(`Student name: `, studentRes?.name, studentRes?.nim);
// Search for lecturer and get single result
const lecturerRes = await pddikti.search.lecturer({
name: "Mulyono",
});
console.log(`Lecturer name: `, lecturerRes?.name, lecturerRes?.nidn);
// Search for campus and get single result
const campusRes = await pddikti.search.campus({
name: "Universitas Gadjah Mada",
});
console.log(`Campus name: `, campusRes?.name);
// Search for programs and get single result
const programRes = await pddikti.search.program({
name: "Kehutanan",
});
console.log(`Program study name: `, programRes?.name);
/**
* THE CODE BELOW IS THE SAME AS THE ONE ABOVE
*/
const [student, lecturer, campus, program] = await Promise.all([
pddikti.search.student({ name: "Mulyono" }), // Search for student and get single result
pddikti.search.lecturer({ name: "Mulyono" }), // Search for lecturer and get single result
pddikti.search.campus({ name: "Universitas Gadjah Mada" }), // Search for campus and get single result
pddikti.search.program({ name: "Kehutanan" }), // Search for programs and get single result
]);
console.log(`Student name: `, student?.name, student?.nim);
console.log(`Lecturer name: `, lecturer?.name, lecturer?.nidn);
console.log(`Campus name: `, campus?.name);
console.log(`Program study name: `, program?.name);Currently there is a bug found in Logger that does not dynamically set the context based on the calling class.
Contact us at: x403.hq@proton.me