🎓 PDDIKTI API Python Library
An unofficial Python wrapper for the Indonesian Higher Education Database (PDDIKTI, Kemdiktisaintek).
pddiktipy gives you a clean, typed interface to student, lecturer, university,
and study-program data from PDDIKTI,
with connection pooling, retries, validation, and comprehensive error handling.
📋 Table of Contents
- Features
- Installation
- Cloudflare access (read this first)
- Quick Start
- Error Handling
- Documentation
- Requirements
- Testing
- Contributing
- License
🚀 Features
- ✅ 70+ endpoints: search, details, statistics, and visualizations
- ✅ Full type hints for good editor support
- ✅ Robust error handling with custom exceptions and input validation
- ✅ Context manager support for clean resource management
- ✅ Connection pooling & retries out of the box
- ✅ Transparent AES-256 decryption for the encrypted search endpoint
📦 Installation
pip install pddiktipy
To let the client read the Cloudflare clearance cookie from your local browser automatically (see below), install the optional extra:
pip install "pddiktipy[auto]"
🚨 Cloudflare access (read this first)
The upstream API (https://pddikti.kemdiktisaintek.go.id/api) is protected by a
Cloudflare Turnstile challenge. A plain HTTP client always receives 403,
so api() with no arguments will not work on its own. Only a real browser
can pass the challenge. Even automated browsers (Selenium/Playwright) are
blocked.
You therefore need to supply Cloudflare clearance in one of three ways.
Option A: auto cookie (easiest, on your own machine)
pip install "pddiktipy[auto]"
- Open
https://pddikti.kemdiktisaintek.go.idin Chrome or Edge and complete the "Verify you are human" check once. - Run your code. The client reads the
cf_clearancecookie for you:
from pddiktipy import api
with api(auto_cookie=True) as client:
print(client.get_pt_count()) # {'status': 'success', 'data': {'jumlah': 4416}}
Option B: paste the cookie manually (works on servers or other machines)
- Open the site in your browser and pass the check.
- Open DevTools (
F12) → Application → Cookies → select the site → copy the value ofcf_clearance. - In DevTools → Network, click any request → Headers → copy the
User-Agent(the cookie is bound to it).
from pddiktipy import api
client = api(
cf_clearance="PASTE_CF_CLEARANCE_HERE",
user_agent="PASTE_YOUR_BROWSER_USER_AGENT_HERE",
)
print(client.get_pt_count())
Option C: run your own solver proxy (most stable for production)
Point base_url at a service that solves Cloudflare for you (for example a
FlareSolverr-backed proxy that
forwards to the PDDIKTI upstream):
from pddiktipy import api
client = api(base_url="http://localhost:8080/api")
print(client.get_pt_count())
Note:
cf_clearanceis bound to your IP and User-Agent and expires after ~30 minutes. For long-running, unattended use, prefer Option C.
⚡ Quick Start
from pddiktipy import api
from pprint import pprint
# See "Cloudflare access" above for how to provide clearance.
with api(auto_cookie=True) as client:
# Search across all categories (payload is decrypted for you)
results = client.search_all("Universitas Diponegoro")
pprint(results)
# Search a specific category
students = client.search_mahasiswa("Ilham Riski Wibowo")
pprint(students)
# Aggregate statistics
print(client.get_pt_count()) # number of universities
print(client.get_mahasiswa_count()) # number of students
A runnable example lives in examples/quickstart.py.
⚠ Error Handling
By default, API methods log and return None on failure rather than
raising, so everyday calls stay simple:
with api(auto_cookie=True) as client:
result = client.search_mahasiswa("") # invalid keyword -> None
if result is None:
print("No result / request failed")
The lower-level exceptions are still available if you build on top of the helper:
from pddiktipy.exceptions import (
ValidationError, APIConnectionError, APITimeoutError,
APIRateLimitError, APIResponseError, PDDIKTIError,
)
If the upstream returns a Cloudflare challenge, the client raises an
APIResponseError whose message explains exactly how to supply clearance.
📚 Documentation
➡️ API Documentation: every method, with parameters, examples, and response field descriptions.
📋 Requirements
- Python 3.7+
- requests
- cryptography
- browser_cookie3 (optional, only for
auto_cookie=True)
🧪 Testing
🧪 Testing Guide: how to run the test suite.
Offline tests (no network) can be run directly:
python -m pytest tests/test_crypto_and_endpoints.py -q
🤝 Contributing
🤝 Contributing Guide: how to contribute.
📄 License
Distributed under the MIT License.
📞 Support & Contact
- Author: Ilham Riski Wibowo
- Issues: GitHub Issues
- PyPI: pddiktipy
⭐ If this library helps your project, please consider starring it on GitHub!
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pddiktipy-2.1.3.tar.gz.
File metadata
- Download URL: pddiktipy-2.1.3.tar.gz
- Upload date:
- Size: 19.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
faef18c753d375dff685d2e145cac1d75aaf516e7016bbdcf30784d201640236
|
|
| MD5 |
358701be08773c712960ac1542c21c47
|
|
| BLAKE2b-256 |
8c02ffeb8148fcd7180d722234be9fc3371cecfdcd441161594e4c4d6a75fb9a
|
File details
Details for the file pddiktipy-2.1.3-py3-none-any.whl.
File metadata
- Download URL: pddiktipy-2.1.3-py3-none-any.whl
- Upload date:
- Size: 19.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ee242773154bc74b55379ebd5e25231d7c5c4ea289626a0c2a7b8580854cb443
|
|
| MD5 |
dd2793f9556f7a78d9b66b21225e5e75
|
|
| BLAKE2b-256 |
c4c74ac36fed33380e1e3549417c5bff54113527f4bb05048f586dd6310495f9
|