Skip to content

nsmle/pddikti

Repository files navigation

PDDikti

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 user

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


✨ Features

  • 🔍 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.

Installation

Installing with npm:

npm install @x403/pddikti

Installing with Yarn:

yarn add @x403/pddikti

Installing with pnpm:

pnpm add @x403/pddikti

Installing with bun:

bun add @x403/pddikti

Usage

Importing

ESM/TypeScript/Webpack:

import { PDDikti } from "@x403/pddikti"; // or: import PDDikti from "@x403/pddikti";

const pddikti = new PDDikti();

CommonJS:

const { PDDikti } = require("@x403/pddikti"); // or:  const PDDikti = require('@x403/pddikti').default;

const pddikti = new PDDikti();

Example

Search and get student detail:

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");
}

Search and get lecturer detail:

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");
}

Search all:

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);
  }
}

Single specific search result:

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);

Bug

Currently there is a bug found in Logger that does not dynamically set the context based on the calling class.

Inquiry

Contact us at: x403.hq@proton.me

About

A TypeScript library for accessing PDDikti API

Topics

Resources

License

Stars

Watchers

Forks

Contributors