🎓 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 / 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 -> logs and returns 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!
Metadata
Release files for pddiktipy 2.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pddiktipy-2.1.0.tar.gz | 18.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pddiktipy-2.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 37.5 kB
Release files / pddiktipy-2.1.0.tar.gz
| Download URL | pddiktipy-2.1.0.tar.gz |
|---|---|
| Size | 18.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9db6fced69dc2d3eca67bc482a5b8610c7ee1816d687bdaa19a22c887599004b
|
|
BLAKE2b-256 checksum How to use checksums |
c39ea0d0d2b34bb1fff3d62526eddddc037da4bdcb5b5b30c4bef94f05950b21
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.2
|
Release files / pddiktipy-2.1.0-py3-none-any.whl
| Download URL | pddiktipy-2.1.0-py3-none-any.whl |
|---|---|
| Size | 18.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8bc88193de5bc07424db87b5a1b091612589dcded93d9f4c66fe3054c6c14956
|
|
BLAKE2b-256 checksum How to use checksums |
dea6939111e0f9f55c9bb7da0cceb779b7a483d42ce2018c831cd3ce0240c62d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.2
|